
У меня есть .bash_profile
и в этом у меня есть набор псевдонимов. Эти псевдонимы в данный момент выполняют только одну команду, и это было довольно просто. Однако я хотел бы сделать две вещи с новым псевдонимом, который я пытаюсь создать.
- CD в каталог
- Запустить команду из этого каталога
решение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'