Обробка обмежень псевдоніму за допомогою команд групи та рядка тут
Псевдоніми не можуть приймати аргументи, але ми можемо "імітувати" це. Візьмемо для прикладу мою відповідь на це питання .
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
Це, звичайно, не те, що широко використовувалося б, просто тому, що в реальному світі ми маємо справу зі складними аргументами, тому такий підхід не зовсім практичний. Функції набагато гнучкіші. І необхідність цитувати рядок аргументів стає прикрою швидкою.
Незважаючи на обмеження, це працює з простими рядками як аргументами, де ми можемо дозволити розбиття слів, тим самим частково дозволяє нам наводити аргументи на псевдоніми.