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

Наконец, я понял.

Проблема решается установкой ssl: check-hostname false .

21
30.06.2019, 19:37
4 ответа

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

( 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

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

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


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

alias thing='$HOME/somedir/script.sh'

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

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

PATH="$PATH:$HOME/somedir"

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

$ script.sh

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

35
27.01.2020, 19:43

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

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

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

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

1
27.01.2020, 19:43

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

alias do_something='cd /tmp; ls'
-1
27.01.2020, 19:43
alias <name-of-the-alias>='cd <the-directory> && <command>'

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

alias logs='cd /var/log/ && ls'
6
27.01.2020, 19:43

Теги

Похожие вопросы