Bash

如何使用提供的參數使用空格 hack 製作別名尾隨

  • October 21, 2016

我有兩個別名watchExpandl. 我知道您可以通過放置一個尾隨空格來使 bash 擴展與別名一起使用,如下所示:

alias watchExpand='watch '

l別名為ls -larthiF --context。所以當我輸入命令時watchExpand l,它就像一個魅力。

但是,如果我向watchExpand命令提供參數,例如

watchExpand -n 1 l

我的l別名不再有效。如何在參數後獲得 bash 擴展?

這是我認為你要求的壞主意:

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
}

我用我的方式找出解決方案。

首先,如果我願意,我創建了一個名為“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 $$另一個缺點是它不能遞歸地解析別名。

引用自:https://unix.stackexchange.com/questions/317999