Чтобы выполнить команду с определенным рабочим каталогом, обычно
( 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 "$@" )
.