Как выполнить команду из определенного каталога без фактического перехода в этот каталог
Я хочу выполнить команду типа '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 -
после того, как все будет сделано. Эта команда используется для возврата в ваш последний рабочий каталог.