
У меня есть два псевдонима watchExpand
и l
. Я знаю, что можно заставить расширение bash работать с псевдонимами, поместив завершающий пробел, например, так:
alias watchExpand='watch '
l
имеет псевдоним ls -larthiF --context
. Поэтому, когда я ввожу команду, watchExpand l
она работает как часы.
Однако если я укажу параметр watchExpand
команды, например
watchExpand -n 1 l
Мой l
псевдоним больше не работает. Как мне получить расширение bash после аргументов?
решение1
Вот плохая идея, которую ядуматьВы запрашиваете:
function watchExpand() {
e=""
for param in $@
do
if alias $param >/dev/null 2>&1
then
exp=$(alias $param | cut -d= -f2| sed -e s/^\'// -e s/\'\$//)
e+=" $exp"
else
e+=" $param"
fi
done
watch $e
}
решение2
Zsh имеет глобальные псевдонимы. Вы можете сделать:
alias -g @l='ls -larthiF --context'
а потом:
watch -n 1 @l
Обратите внимание, что @
это не обязательно, но я использую это, чтобы избежать непреднамеренного вызова глобальных псевдонимов.
решение3
Я нахожу решение своим способом.
Во-первых, я создаю функцию под названием «addExpand», чтобы было проще добавлять псевдонимы/функции, если я захочу.
xb@dnxb:/tmp/t$ type -a addExpand
addExpand is a function
addExpand ()
{
echo -e "#!/bin/bash\nshopt -s expand_aliases\n. ~/.bash_aliases 2>/dev/null\n$1"' "$@"' | sudo tee /usr/bin/e_"$1";
sudo chmod +x /usr/bin/e_"$1"
}
xb@dnxb:/tmp/t$ addExpand l
#!/bin/bash
shopt -s expand_aliases
. ~/.bash_aliases 2>/dev/null
l "$@"
После запуска addExpand l
псевдоним l
будет создан как исполняемый файл с именем/usr/bin/e_lсо следующим содержанием:
xb@dnxb:/tmp/t$ cat /usr/bin/e_l
#!/bin/bash
shopt -s expand_aliases
. ~/.bash_aliases 2>/dev/null
l "$@"
Теперь наслаждайтесь использованием расширенной версии псевдонима/функции:
xb@dnxb:/tmp/t$ watch --color -n 1 e_l /tmp //works like a charm !!!
xb@dnxb:/tmp/t$
Примечание:
[1] e_l
, префикс «e_» указывает на расширенную версию команды.
[2] Я чувствую, что слишком тяжело выполнять поиск каждую секунду, если запущен с watch -n 1
. Мне, возможно, придется найти способ решить эту проблему.
[3] Другим недостатком является то, что псевдонимы не разрешаются рекурсивно.