如何使用空格 hack 使别名尾随与提供的参数一起工作

如何使用空格 hack 使别名尾随与提供的参数一起工作

我有两个别名watchExpandl。我知道您可以通过放置尾随空格来使 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] 另一个缺点是它不能递归地解析别名。

相关内容