Відповіді:
Псевдоніми - це як команди, оскільки всі аргументи їм передаються як аргументи до програми, яку вони псевдонімують. Наприклад, якщо ви були псевдонім , ls
щоб ls -la
, потім , набравши ls foo bar
буде дійсно виконати ls -la foo bar
в командному рядку.
Якщо ви хочете мати фактичний контроль над інтерпретацією аргументів, ви можете написати функцію на зразок:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "$@"
}
Рішення псевдоніма
Якщо ви справді проти використання функції як такої, ви можете використовувати:
$ alias wrap_args='f(){ echo before "$@" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
Ви можете замінити $@
з , $1
якщо ви хочете тільки перший аргумент.
Пояснення
Це створює тимчасову функцію f
, якій передаються аргументи.
Аргументи псевдоніму передаються лише наприкінці. Зверніть увагу, що f
називається в самому кінці псевдоніма.
unset -f
Видаляє визначення функції в якості псевдоніма виконується так що не стирчати після цього.
wrap_args x y z
дає мені: bash: синтаксична помилка біля несподіваного маркера `('
f
псевдонім. Як тільки я не маю на увазі, f
це працює чудово. Старе ім’я зіткнення річ.
command type f
:)
Додаючи до теперішніх відповідей, важливим для розуміння того, як працюють псевдоніми, є те, що всі параметри, які ви вводите після введення псевдонімової команди, будуть використовуватися буквально в кінці. Тому немає можливості використовувати псевдонім для двох команд (трубопровідних чи ні), з яких перша повинна інтерпретувати параметри. Щоб зрозуміти, ось приклад того, що не працюватиме так, як очікувалося:
alias lsswp="ls -l | grep swp"
(приклад, натхненний цим питанням ), це завжди використовуватиме результат, який ls -l
виконується у поточному каталозі, і робитиметься погіршення щодо цього - тому використовуючи
lsswp / tmp /
було б рівнозначно ls -l | grep swp /tmp/
і ні ls -l /tmp/ | grep swp
.
Для всіх цілей, де аргументи слід використовувати десь посередині, потрібно використовувати function
замість alias
.
Насправді вам нічого не потрібно робити; псевдоніми роблять це автоматично. Наприклад:
$ alias less="less -eirqM"
$ less foo.txt
Ви побачите першу сторінку foo.txt і less
вийдете з EOF (-e), пошук буде нечутливим до регістру (-i) тощо.
Я відповідаю за csh:
Так, ви можете використовувати параметри в псевдонімах і - як відмінність від сказаного вище - ви можете посилатися на них де завгодно у визначенні псевдоніму - не тільки в кінці.
Приклад для tar-gz -ing щось:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
, де !:1
і !:2
які параметри ви будете надавати під час виклику псевдоніма.
Приклад використання:
$ ls
clrcf.dat user_comment_2016.06.03_12:51:50.txt user_comment_2016.06.03_12:54:48.txt
TEST-wADM.tec user_comment_2016.06.03_12:52:04.txt user_comment_2016.06.03_12:55:13.txt
$ tgz user* out
a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K
$ ls out*
out.tar.gz
Це фактично означає, що ви використовували два параметри, які ви вставляли у довільних місцях команди tar, роблячи все це псевдонімом tgz
sh
визначеніmy_program_wrapper() { ...; }
. Bash обробляє ключове слово,function
але чому б не піти з тим, що більш портативно?