Обход ограничений псевдонимов с помощью групповой команды и строки здесь
Псевдонимы не могут принимать аргументы, но мы можем «имитировать» это. Возьмите, например, пример моего ответа на этот вопрос .
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
Это, конечно, не то, что будет широко использоваться, просто потому, что в реальном мире нам приходится иметь дело со сложными аргументами, поэтому такой подход не совсем практичен. Функции гораздо более гибкие. И необходимость заключать в кавычки строку args быстро раздражает.
Несмотря на ограничения, это работает с простыми строками в качестве аргументов, где мы можем позволить себе разделение слов, что частично позволяет нам давать аргументы псевдонимам.