Как выполнить команду из определенного каталога, фактически не переходя в этот каталог - PullRequest
17 голосов
/ 25 января 2010

Я хочу выполнить команду типа 'git tag -l' внутри каталога / home / user / git / app /, но на самом деле я нахожусь в / home / user. Как я могу сделать это в bash, не меняя мой рабочий каталог?

Так что НЕ:

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

потому что это на самом деле меняет мой рабочий каталог и приходится снова делать 'cd / home / user'.

Ответы [ 5 ]

35 голосов
/ 25 января 2010

Просто заключите все в скобки. Это запустит его в подоболочке, которая может перейти в любой каталог и не повлияет на ваш «текущий рабочий». Вот пример.

noufal@sanctuary% pwd
/tmp/foo
noufal@sanctuary% (cd ../bar && pwd && ls -a )
/tmp/bar
./  ../
noufal@sanctuary% pwd
/tmp/foo
noufal@sanctuary%            
5 голосов
/ 25 января 2010

Вот еще одно решение: используйте pushd для изменения каталога, затем popd для возврата:

pushd /home/user/git/app && git tag -l; popd
4 голосов
/ 25 января 2010

Если рассматриваемая команда всегда будет командой git, вы должны просто использовать опции --git-dir и --work-tree, чтобы указать git, что делать! (Или, если вы делаете это много в течение сценария, установите переменные GIT_DIR и GIT_WORK_TREE на соответствующие пути)

Если это общий вопрос, я считаю, что Анджей начал с лучшего предложения: используйте подоболочку. Однако правильный способ запустить подоболочку - использовать круглые скобки, а не использовать подстановку команд (если вы на самом деле не хотите захватить вывод):

( cd $dir && run_command )

Другое решение, предложенное Феликсом и ibread, конечно, будет работать, но будьте осторожны - если выполняемая вами команда, возможно, является функцией оболочки, то она также может cd и изменить эффект cd - в конце. В общем случае безопаснее всего сначала сохранить текущий каталог в переменной.

1 голос
/ 25 января 2010

Возможно, вы захотите сделать что-то вроде (cd /home/user/git/app && git tag -l). Это порождает новую оболочку и выполняет команды в оболочке без изменения вашей оболочки. Вы можете проверить это, выполнив следующее:

$ echo $OLDPWD
/Users/daveshawley
$ (cd / && ls)
...
$ echo $OLDPWD
/Users/daveshawley
0 голосов
/ 25 января 2010

попробуйте использовать

cd -

после того, как все сделано. Эта команда используется для возврата к вашему последнему рабочему каталогу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...