Могу ли я передать аргументы команде псевдонима?

19

Я хочу знать, могу ли я передать аргумент с помощью команды псевдонима.

например:

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

Теперь dнапечатает последние 5 строк. Если я хочу использовать d для печати другого числа строк, я должен снова внести изменения в объявление команды псевдонима d.

Есть ли способ, которым я могу изменить объявление псевдонима, чтобы мне не пришлось повторно вводить объявление, чтобы изменить количество строк. Как включение передачи числа строк в качестве аргумента при объявлении псевдонима для d? Или есть какой-то другой способ решить эту проблему?

srk_cb
источник
В (t) csh «\! *» Ссылается на аргументы псевдонима (обратный слеш - это просто экранирование с восклицательным знаком, что обычно означает «история»), и вы даже можете ссылаться на отдельные аргументы, хотя я не помню, как. Так что, возможно, "tail -n \! *" Или что-то еще (я не думаю, что \! * Будет работать со знаком минус непосредственно перед ним). Однако, не уверен, будет ли это работать в (ба) ш.
Баррикартер

Ответы:

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

Это, конечно, не то, что будет широко использоваться, просто потому, что в реальном мире нам приходится иметь дело со сложными аргументами, поэтому такой подход не совсем практичен. Функции гораздо более гибкие. И необходимость заключать в кавычки строку args быстро раздражает.

Несмотря на ограничения, это работает с простыми строками в качестве аргументов, где мы можем позволить себе разделение слов, что частично позволяет нам давать аргументы псевдонимам.

Сергей Колодяжный
источник