Как выполнить команду из определенного каталога без фактического перехода в этот каталог

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

Итак, NOT:

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

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

Ответы

Ответ 1

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

[email protected]% pwd
/tmp/foo
[email protected]% (cd ../bar && pwd && ls -a )
/tmp/bar
./  ../
[email protected]% pwd
/tmp/foo
[email protected]%            

Ответ 2

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

pushd /home/user/git/app && git tag -l; popd

Ответ 3

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

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

( cd $dir && run_command )

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

Ответ 4

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

$ echo $OLDPWD
/Users/daveshawley
$ (cd / && ls)
...
$ echo $OLDPWD
/Users/daveshawley

Ответ 5

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

cd -

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