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

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

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

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

решение1

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

( 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

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

решение2

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

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

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

решение3

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

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

Ограничением этой функции является то, что подстановочные знаки заполняются относительно исходного каталога, а не относительно каталога, в котором выполняется команда.В zsh можно сделать лучше.

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

решение4

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

alias do_something='cd /tmp; ls'

Связанный контент