我想在目录/ home / user / git / app /中执行类似'git tag -l'的命令,但实际上我在/ home / user中。 如何在不改变工作目录的情况下在bash中执行此操作?
所以不是:
cd /home/user/git/app && git tag -l
因为这实际上改变了我的工作目录,并且必须再次执行'cd / home / user'。
答案 0 :(得分:34)
把整个事情都包括在内。这将在子shell中运行它可以转到任何目录,而不会影响你的“当前工作”。这是一个例子。
noufal@sanctuary% pwd
/tmp/foo
noufal@sanctuary% (cd ../bar && pwd && ls -a )
/tmp/bar
./ ../
noufal@sanctuary% pwd
/tmp/foo
noufal@sanctuary%
答案 1 :(得分:5)
这是另一种解决方案:使用pushd更改目录,然后弹出以返回:
pushd /home/user/git/app && git tag -l; popd
答案 2 :(得分:4)
如果有问题的命令总是git命令,你应该使用--git-dir
和--work-tree
选项来告诉git要做什么! (或者,如果您在脚本的过程中执行此操作,请将变量GIT_DIR和GIT_WORK_TREE设置为适当的路径)
如果这是一个普遍的问题,我相信Andrzej有一个最好的建议:使用子shell。但是,启动子shell的正确方法是使用括号,而不是使用命令替换(除非您实际上想要捕获输出):
( cd $dir && run_command )
正如Felix和ibread所建议的另一个解决方案当然会有效,但要小心 - 如果你执行的命令可能是shell函数,那么它也可以cd,并改变{的效果{1}}最后。一般情况下最安全的事情是首先将当前目录存储在变量中。
答案 3 :(得分:1)
您可能想要执行(cd /home/user/git/app && git tag -l)
之类的操作。这会生成一个新shell并在shell中执行命令而不更改shell。您可以通过执行以下操作来验证这一点:
$ echo $OLDPWD
/Users/daveshawley
$ (cd / && ls)
...
$ echo $OLDPWD
/Users/daveshawley
答案 4 :(得分:0)
尝试使用
cd -
一切都完成后此命令用于返回上一个工作目录。
答案 5 :(得分:0)
可以在 .bashrc
中添加以下功能execute_under_directory()
{
if [ $# -lt 2 ]
then
echo "usage: execute_under_directory <DIRECTORY_PATH> <COMMAND>"
return 1
fi
local current_directory=$(pwd)
cd $1
shift
"$@"
cd $current_directory
}
例如,还添加一个别名
alias eud=execute_under_directory
,您可以像这样运行任何命令:
eud path/to/project git tag -l