有没有办法在Dockerfile中使用pushd/popd命令?它会制作一些安装脚本,如果可能的话我会更容易.
我正在尝试使用 pushd
#!/bin/bash
function cloneAll {
[ -d ~/mapTrials ] || mkdir ~/mapTrials
pushd '~/mapTrials/'
echo $(pwd)
popd
}
Run Code Online (Sandbox Code Playgroud)
这echo $(pwd)为我提供了与我从中调用脚本相同的工作目录。
我在其他 SO 答案中读到 pushd 仅适用于子进程,我必须为其创建别名。我也这样做了。
我尝试执行一些命令,例如mkdir查看它的创建位置。它是在我调用脚本的目录中创建的,而不是在pushd.
我如何让这个工作?如何进入 shell 脚本中的特定目录,然后在该目录中执行命令?
提前致谢。
我在我的 bash 脚本中遇到了一些麻烦,无法进行适当的“pushd/popd 清理”。也就是说:如果我做pushd了几次,我想确保popd之前做同样的次数exit。
但是,我注意到 pushd/popd 堆栈似乎不是全局的。
假设我example-pushd-twice.sh在 homedir 中调用了这个脚本:
pushd /etc
pushd /tmp
Run Code Online (Sandbox Code Playgroud)
我从我的 homedir 中的 shell 中执行此操作:(导致块引用中的输出)
dirs
~
./example-pushd-twice.sh
/etc ~
/tmp /etc ~
我现在希望仍然在/tmp并且仍然有一个包含 3 个目录的目录堆栈,但是:
dirs
~
这是正确的行为吗?我可以信任一个 shell 脚本来调用它自己的 pushd/popd 堆栈,这样我就不必关心事后清理了吗?
pushd有没有办法在脚本末尾撤消所有内容。我所拥有的是:
pushd somwhere
rem doing stuff
goto end
:end
popd
goto :EOF
Run Code Online (Sandbox Code Playgroud)
我想要的是:
setlocal
pushd somwhere
rem doing stuff
goto :EOF
Run Code Online (Sandbox Code Playgroud)
但这不起作用,目录保持“pushd”状态。我无法说出pushd会发生多少次的另一种尝试是:
set CurrentDir=%CD%
rem doing a lot of pushd and popd
pushd somwhere
:POPBACK
if /i not "%CD%" == "%CurrentDir%" popd & goto POPBACK
Run Code Online (Sandbox Code Playgroud)
但这看起来我很容易陷入困境:POPBACK。添加一个计数器来退出该循环有点不确定我最终会在哪个目录。
在这种情况下,我想知道 a 是否可以看到 Pushd 目录的堆栈。我发现的唯一的事情是$+为prompt $P$+$G每个 Pushd 目录添加一个“+”,例如D:\CMD++>。但我看不出如何利用它。
编辑:我刚刚注意到有一些问题让$+我prompt困惑。上面示例setlocal中的实际上使脚本返回到初始目录,但提示符显示一个“+”,表示缺少popd.
D:\CMD>test.cmd
D:\CMD>prompt $P$+$g
D:\CMD>setlocal
D:\CMD>pushd e:\DATA …Run Code Online (Sandbox Code Playgroud) pushd ×4
bash ×2
shell ×2
batch-file ×1
cmd ×1
directory ×1
dockerfile ×1
scripting ×1
stack ×1
windows ×1