Чи можу я передати аргументи команді alias?


19

Я хочу знати, чи можу я передати аргумент командою псевдонім.

наприклад:

alias d="dmesg|grep -iw usb|tail -5" 

Тепер dнадрукуємо останні 5 рядків. Якщо я хочу використовувати d, щоб надрукувати іншу кількість рядків, я повинен знову змінити декларацію команди псевдоніму d.

Чи є спосіб змінити декларацію псевдоніму, щоб мені не довелося повторно вводити декларацію, щоб змінити кількість рядків. Як включити передачу кількості рядків як аргумент під час декларування псевдоніма для d? Або існує якийсь інший метод вирішення цього питання?


У (t) csh "\! *" Посилається на аргументи на псевдонім (зворотна косої риси - це просто уникнути знака оклику, що зазвичай означає "історія"), і ви навіть можете посилатися на окремі аргументи, хоча я не пам'ятаю як. Тож можливо "хвіст -n \! *" Або щось подібне (я не думаю, що \! * Буде працювати зі знаком мінус безпосередньо перед ним). Однак не впевнений, чи спрацює це в (ба) ш.
barrycarter

Відповіді:


20

Псевдоніми не беруть аргументів. З псевдонімом, подібним alias foo='bar $1'до цього, $1волю буде розширено оболонкою до першого аргументу оболонки (що, ймовірно, нічого), коли псевдонім запускається.

Отже: замість цього використовуйте функції .

d () {
  num=${1:-5}
  dmesg |grep -iw usb|tail -$num
}

num=${1:-5} використовує перший аргумент із значенням за замовчуванням 5, якщо він не вказаний.

Тоді ви можете зробити:

$ d
# prints 5 lines
$ d 10
# prints 10 lines

Або, якщо змінити параметри, які ви використали трохи:

alias d="dmesg|grep -iw usb|tail -n 5"

Потім ви можете прийняти додаткові -nпараметри:

$ d
# prints 5 lines
$ d -n 10
# prints 10 lines

Якщо -nвказано кілька варіантів tail, використовується лише останній.


Для функціонально виклику , як я :) це може бути корисно для держави коротко , де поставити функцію ... тобто ~/.bashrcчи rc.localабо там , де?
WinEunuuchs2Unix

@ WinEunuuchs2Unix, де б не було поставлено псевдонім.
муру

5

Вам потрібно мати функцію для цього, як описано в SO та тут . Спробуйте наступне:

foo() { /path/to/command "$@" ;}

і зателефонуйте за fooдопомогою:

foo arg1 arg2 arg3

4

Обробка обмежень псевдоніму за допомогою команд групи та рядка тут

Псевдоніми не можуть приймати аргументи, але ми можемо "імітувати" це. Візьмемо для прикладу мою відповідь на це питання .

alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'

Ключові моменти, які відбуваються тут:

  • ми використовуємо readвбудований для читання рядка в змінну d. Оскільки ми хочемо прочитати повний рядок, включаючи порожні символи (новий рядок, вкладки, пробіли), ми використовуємо IFS=та відключаємо втечу зворотної косої риски -r.
  • <<<яка є оператор тут рядки дозволяє перенаправляти будь-який рядок ми пропонуємо в якості аргументу mkcdпсевдоніма; використання було б якmkcd "some directory"
  • кілька команд всередині псевдоніму об'єднуються і виконуються в поточній оболонці за допомогою { list; }структури (яка відома як group commandв bashпосібнику). Зауважте, що потрібний пробіл після {та ;окремий список команд потрібні.

У вашому конкретному прикладі ми могли б зробити:

alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'

Ми також можемо використовувати розділення слів для зберігання аргументів, розділених пробілом:

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "arg1 arg2"
arg1
arg2

Або ми можемо використовувати масиви для надання декількох аргументів:

bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";}  <<< "arg1 arg2"
arg2
arg1

Але чи хороший цей підхід?

Не обов'язково. Проблема такого підходу полягає в тому, що він дуже специфічний - аргументи не можна легко навести, а це означає, що ми можемо мати аргументи лише без пробілів.

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "'arg1 with space' arg2"
'arg1
with space' arg2

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

Незважаючи на обмеження, це працює з простими рядками як аргументами, де ми можемо дозволити розбиття слів, тим самим частково дозволяє нам наводити аргументи на псевдоніми.

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