Псевдоним CD в каталоге и вызов команды

У меня есть .bash_profile и у меня есть набор псевдонимов. Эти псевдонимы на данный момент выполняют только одну команду, и это было довольно легко. Однако я хотел бы сделать две вещи с новым псевдонимом, который я пытаюсь создать.

  1. CD в ​​каталог
  2. Выполнить команду из этого каталога

Я не эксперт с bash. Мог ли кто-нибудь объяснить мне, как я могу это сделать?

Чтобы выполнить команду с определенным рабочим каталогом, обычно

 ( 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 )' 

но для общего случая вам придется использовать функцию оболочки:

 cdrun () { ( cd "$1" && shift && command "$@" ) } 

Это будет использоваться как

 $ cdrun "$HOME/somedir" ./script 

который запускает скрипт script расположенный в каталоге $HOME/somedir , с $HOME/somedir в качестве рабочего каталога или

 $ cdrun / ls -l 

который предоставит вам список каталогов в «длинном формате» корневого каталога.

Функция оболочки принимает свой первый аргумент и пытается перейти на этот каталог. Если это сработает, оно смещает имя каталога из позиционных параметров (список аргументов командной строки) и выполняет команду, заданную остальными аргументами. command – это встроенная команда в оболочке, которая просто выполняет свои аргументы в качестве команды.


Все это необходимо, если вы хотите выполнить команду с измененным рабочим каталогом . Если вы просто хотите выполнить команду, расположенную в другом месте, вы, очевидно, можете использовать

 alias thing='$HOME/somedir/script' 

но это запустило бы script расположенный в $HOME/somedir с текущим каталогом в качестве рабочего каталога.

Другой способ выполнения сценария, который находится в другом месте без изменения рабочего каталога, заключается в добавлении местоположения сценария в PATH среды PATH , например

 PATH="$PATH:$HOME/somedir" 

Теперь script в $HOME/somedir будет $HOME/somedir из любого места, просто используя

 $ script 

Опять же, это не изменяет рабочий каталог для команды.

 alias <name-of-the-alias>='cd <the-directory> && <command>' 

Итак, если вы хотите сменить каталог (cd) в папку /var/log/ и затем перечислить (ls) его файлы, вы можете добавить в свой файл .bash_profile следующее:

 alias logs='cd /var/log/ && ls' 

Я использую эту функцию для запуска одной команды в другом каталоге:

 cd1 () { if [ $# -eq 1 ]; then command cd -- "$1" else ( command cd -- "$1" && shift && "$@" ) fi } 

Эта функция действует как обычный cd если вызывается с одним аргументом, поэтому вы можете называть его cd . (Эта функция не поддерживает какие-либо опции, но опции для cd редко используются.)

Разделите команды точкой с запятой, например:

 alias do_something='cd /tmp; ls'