Как заставить псевдоним заканчиваться пробелом, хак работает с переданным параметром

Как заставить псевдоним заканчиваться пробелом, хак работает с переданным параметром

У меня есть два псевдонима 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] Другим недостатком является то, что псевдонимы не разрешаются рекурсивно.

Связанный контент