Псевдонім на компакт-диску в каталог і викликати команду


21

У мене є .bash_profileі в тому, що у мене є набір псевдонімів. Ці псевдоніми на даний момент виконують лише одну команду, і це було досить просто. Однак я хотів би зробити дві речі з новим псевдонімом, який я намагаюся створити.

  1. CD у каталог
  2. Запустіть команду з цього каталогу

Відповіді:


26

Для виконання команди з певним робочим каталогом зазвичай це робиться

( 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
Відмінна, вичерпна відповідь. Я просто думав , що я згадаю , що визначення функції потрібно тільки один спосіб угруповання команд і дужки для подоболочки досить: cdrun () ( cd "$1" && shift && command "$@" ).
Ентоні Г - справедливість для Моніки

2
@AnthonyGeoghegan Ага, це правда. Я завжди використовую { ... }для узгодженості з більш довгими функціями.
Кусалаланда

Це запитання і відповіді, здається, говорить про мою ситуацію, і може бути вдосконаленням щодо використання оточуючих pushdі popd(також > /dev/nullякщо ви намагаєтесь уникати вихідних повідомлень), одночасно підтримуючи чистий контекст!
Pysis

1
@Pysis Так, (cd dir && thing)також набагато більш портативний, ніж використання pushdта popd.
Кусалаланда

@Kusalananda Дійсно? У мене вони працювали принаймні для декількох систем.
Pysis

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

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

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

1

Я використовую цю функцію для запуску однієї команди в іншому каталозі:

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

Обмеженням цієї функції є те, що підстановочні символи заповнюються відносно вихідного каталогу, а не відносно каталогу, де виконується команда. Можна краще зробити в zsh .

Ця функція діє як звичайна, cdякщо її викликають за допомогою одного аргументу, тому ви, можливо, захочете її зателефонувати cd. (Ця функція не підтримує жодних параметрів, але параметри cdвикористовуються рідко.)


-1

Відокремте команди з комою, напр .:

alias do_something='cd /tmp; ls'

8
Якщо cdне вдасться, ви отримаєте список каталогів неправильного каталогу. Краще використовувати &&замість ;тут.
Кусалаланда

@Kusalananda має рацію. Ви можете знайти більше у цій відповіді
nikolas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.