我想在目录/ home/user/git/app /中执行像'git tag -l'这样的命令,但我实际上在/ home/user中.如何在不改变工作目录的情况下在bash中执行此操作?
所以不是:
cd /home/user/git/app && git tag -l
Run Code Online (Sandbox Code Playgroud)
因为这实际上改变了我的工作目录,并且必须再次执行'cd/home/user'.
Nou*_*him 37
只是包围整个事情.这将在子shell中运行它可以转到任何目录,而不会影响你的"当前工作".这是一个例子.
noufal@sanctuary% pwd
/tmp/foo
noufal@sanctuary% (cd ../bar && pwd && ls -a )
/tmp/bar
./ ../
noufal@sanctuary% pwd
/tmp/foo
noufal@sanctuary%
Run Code Online (Sandbox Code Playgroud)
这是另一个解决方案:使用pushd更改目录,然后popd返回:
pushd /home/user/git/app && git tag -l; popd
Run Code Online (Sandbox Code Playgroud)
如果有问题的命令始终是 git 命令,您应该只使用--git-dir和--work-tree选项来告诉 git 做什么!(或者,如果您在脚本过程中经常这样做,请将变量 GIT_DIR 和 GIT_WORK_TREE 设置为适当的路径)
如果这是一个一般性问题,我相信 Andrzej 已经提出了最好的建议:使用子 shell。不过,启动子 shell 的正确方法是使用括号,而不是使用命令替换(除非您确实想要捕获输出):
( cd $dir && run_command )
Run Code Online (Sandbox Code Playgroud)
Felix 和 ibread 建议的另一个解决方案当然可以工作,但要小心 - 如果您正在执行的命令可能是 shell 函数,那么它也可以 cd ,并更改最后的效果cd -。一般情况下最安全的方法是首先将当前目录存储在变量中。