Чтобы выполнить команду с определенным рабочим каталогом, обычно
( cd directory && utility )
Круглые скобки cd ...
означают, что команды в них выполняются в подоболочке. Изменение рабочего каталога в подоболочке делает так, что текущий рабочий каталог вызывающей оболочки не изменяется, т. Е. После вызова этой команды вы все равно будете находиться в том же каталоге, где вы начали.
Пример:
( cd / && echo "$PWD" ) # will output "/"
echo "$PWD" # will output whatever directory you were in at the start
Это нельзя превратить в общий псевдоним, так как псевдоним не может принимать никаких аргументов.
Для конкретного каталога и утилиты можно сделать
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
но в общем случае вам придется использовать функцию оболочки:
cdrun () {
( cd "$1" && shift && command "$@" )
}
или
cdrun () (
cd "$1" && shift && command "$@"
)
Замена фигурных скобок с круглыми скобками вокруг тела функции заставляет функцию выполняться в ее собственной подоболочке.
Это будет использоваться как
$ cdrun "$HOME/somedir" ./script.sh
который будет запускать скрипт, script.sh
расположенный в каталоге $HOME/somedir
, с $HOME/somedir
рабочим каталогом, или
$ cdrun / ls -l
который предоставит вам список каталогов в «длинном формате» корневого каталога.
Функция оболочки получает первый аргумент и пытается перейти в этот каталог. Если это работает, он удаляет имя каталога из позиционных параметров (список аргументов командной строки) и выполняет команду, заданную остальными аргументами. command
является встроенной командой в оболочке, которая просто выполняет свои аргументы как команду.
Все это необходимо, если вы хотите выполнить команду с измененным рабочим каталогом . Если вы просто хотите выполнить команду, расположенную в другом месте, вы можете использовать
alias thing='$HOME/somedir/script.sh'
но это будет работать script.sh
расположено в $HOME/somedir
с текущим каталогом в качестве рабочего каталога.
Другой способ выполнения сценария, расположенного в другом месте, без изменения рабочего каталога, - это добавить местоположение сценария в PATH
переменную среды, например:
PATH="$PATH:$HOME/somedir"
Теперь script.sh
в $HOME/somedir
сможет быть запущен из любого места, используя только
$ script.sh
Опять же, это не меняет рабочий каталог для команды.
cdrun () ( cd "$1" && shift && command "$@" )
.{ ... }
для согласованности с более длинными функциями, хотя.pushd
иpopd
(также,> /dev/null
если вы пытаетесь также избежать выходных сообщений), при этом сохраняя контекст в чистоте!(cd dir && thing)
также гораздо более портативен, чем использованиеpushd
иpopd
.Итак, если вы хотите изменить каталог (cd) на папку,
/var/log/
а затем перечислить (ls) ее файлы, вы можете добавить в свой.bash_profile
файл следующее:источник
Я использую эту функцию для запуска одной команды в другом каталоге:
Ограничение этой функции заключается в том, что подстановочные знаки заполнены относительно исходного каталога, а не относительно каталога, в котором выполняется команда. Это можно сделать лучше в Zsh .
Эта функция действует как обычная,
cd
если вызывается с одним аргументом, поэтому вы можете вызвать ееcd
. (Эта функция не поддерживает какие-либо параметры, но параметрыcd
используются редко.)источник
Разделяйте команды точкой с запятой, например:
источник
cd
произойдет сбой, вы получите неправильный каталог. Лучше использовать,&&
а не;
здесь.