Для виконання команди з певним робочим каталогом зазвичай це робиться
( 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 "$@" )
.