如何在别名中正确转义bash函数

时间:2018-12-19 19:17:11

标签: bash awk pipe alias zsh

我有一些bash命令已经成功地通过管道传递在一起:

$> foo --color=RED | grep -Eo '(v[1-9])'

$> v1

假设foo是一个可打印许多内容的别名,我想获取一个version number并将其通过管道传递给另一个获得bar的命令id。所以我添加了它,并且可以正常工作:

$> foo --color=RED | grep -Eo '(v[1-9])' | \ awk '{print "bar --version="$1" --color=RED"}' | xargs -0 bash -c

$> ID: 1234

。现在,我想在我的.aliases文件中创建一个条目,这样就可以像这样运行:

$> wombat RED

问题:我无法使其正常工作

alias wombat='function _w() { 
    COLOR=$1; # cache the color
    foo --color=$COLOR | grep -Eo "(v[1-9])" | \
    awk '{print "bar --version=$1 --color=$COLOR"}' | xargs -0 bash -c; 
};_w'

问题似乎出在我如何逃避(或不逃避)awk命令。 注意:awk命令中,我需要同时引用两者我传递给别名的version numbercolor。 / p>

我尝试了许多变体,但似乎无法正确解决。有人可以协助吗?

2 个答案:

答案 0 :(得分:3)

直接的问题是引号不会嵌套-您不能将单引号字符串(awk脚本)嵌套在单引号字符串(别名定义)中。有多种方法可以使它起作用,但是完全跳过别名部分要简单得多。创建一个定义了一个函数然后立即执行的别名是没有意义的。只需定义一次功能,即可正常使用。像这样:

wombat() { 
    local color="$1" # cache the color
    foo --color="$color" | grep -Eo "(v[1-9])" | \
        awk -v color="$color" '{print "bar --version=" $1 " --color=" color}' | \
        xargs -0 bash -c;
}

请注意,我还对颜色名称的处理方式进行了一些更改:我使用了小写的shell变量名称(有一堆具有特殊含义的全大写字母名称,因此对于您的名称使用小写或大小写混合的名称自己的东西更安全),我将外壳变量local设为变量,然后将其作为变量传递给awk,而不是尝试将其实际嵌入awk脚本中。最后,在awk脚本中,我将对$1color变量的引用放在加引号的字符串之外,以便将它们扩展为它们的值,而不是按字面意义使用。

哦,我将POSIX标准语法用于函数定义,该语法使用()而不是function关键字来表示这是一个函数定义。

由于我实际上没有foobar程序,因此我没有实际测试过。但据我所见,应该有效。

答案 1 :(得分:0)

打开Bash shell调试,这样您就可以了解别名和函数在执行前如何解释

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html

有两种方法可以打开调试。一种是在调试模式bash -x下启动新的Bash会话。另一个方法是在现有的Bash会话set -x

中使用启用调试