如何在不实际更改到该目录的情况下从特定目录执行命令

pri*_*ter 17 bash scripting

我想在目录/ 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)


Hai*_* Vu 6

这是另一个解决方案:使用pushd更改目录,然后popd返回:

pushd /home/user/git/app && git tag -l; popd
Run Code Online (Sandbox Code Playgroud)


Cas*_*bel 5

如果有问题的命令始终是 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 -。一般情况下最安全的方法是首先将当前目录存储在变量中。