我有一些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 number
和color
。 / p>
我尝试了许多变体,但似乎无法正确解决。有人可以协助吗?
答案 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
脚本中,我将对$1
和color
变量的引用放在加引号的字符串之外,以便将它们扩展为它们的值,而不是按字面意义使用。>
哦,我将POSIX标准语法用于函数定义,该语法使用()
而不是function
关键字来表示这是一个函数定义。
由于我实际上没有foo
或bar
程序,因此我没有实际测试过。但据我所见,应该有效。
答案 1 :(得分:0)
打开Bash shell调试,这样您就可以了解别名和函数在执行前如何解释
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html
有两种方法可以打开调试。一种是在调试模式bash -x
下启动新的Bash会话。另一个方法是在现有的Bash会话set -x