![如何使用空格 hack 使别名尾随与提供的参数一起工作](https://linux22.com/image/96983/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%A9%BA%E6%A0%BC%20hack%20%E4%BD%BF%E5%88%AB%E5%90%8D%E5%B0%BE%E9%9A%8F%E4%B8%8E%E6%8F%90%E4%BE%9B%E7%9A%84%E5%8F%82%E6%95%B0%E4%B8%80%E8%B5%B7%E5%B7%A5%E4%BD%9C.png)
我有两个别名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] 另一个缺点是它不能递归地解析别名。