Ответы:
Псевдонимы подобны командам в том, что все аргументы к ним передаются в качестве аргументов псевдониму программы. Например, если вы были псевдоним , 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
Если вы действительно против использования функции как таковой, вы можете использовать:
$ 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
execute в текущем каталоге и выполнит grep для этого - поэтому, используя
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
но почему бы не пойти с тем, что более переносимо?