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

时间:2010-01-25 17:37:14

标签: bash scripting

我想在目录/ home / user / git / app /中执行类似'git tag -l'的命令,但实际上我在/ home / user中。 如何在不改变工作目录的情况下在bash中执行此操作?

所以不是:

cd /home/user/git/app && git tag -l

因为这实际上改变了我的工作目录,并且必须再次执行'cd / home / user'。

6 个答案:

答案 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