【问题标题】:How to properly escape bash function in an alias如何在别名中正确转义 bash 函数
【发布时间】:2018-12-19 19:17:10
【问题描述】:

我已经成功地将一些 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

我尝试了很多变体,但似乎无法做到正确。有人可以帮忙吗?

【问题讨论】:

  • 为什么是别名?只需创建一个函数并在外部调用它
  • 你是说创建一个 bash 脚本和别名吗?只要我可以从系统中的任何位置调用它,就可以了。
  • 不,只需在~/.bashrc 中创建此函数并在任何地方调用它即可
  • 有人应该为“如何为复杂命令定义别名?”写一个好的副本。这只是显示如何使用函数
  • 使用 bash 别名的正确方法是从不

标签: bash awk pipe alias zsh


【解决方案1】:

直接的问题是引号不能嵌套——您不能将单引号字符串(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 变量名称(有一堆全大写的名称具有特殊含义,因此您可以使用小写或混合大小写的名称)自己的东西更安全),我创建了那个 shell 变量local,并将它作为变量传递给awk,而不是试图将它逐字嵌入awk 脚本中。最后,在awk 脚本中,我将对$1color 变量的引用放在带引号的字符串之外,因此它们将被扩展为它们的值,而不是按字面意思使用。

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

因为我实际上没有foobar 程序,所以我没有实际测试过这个。但据我所知,它应该工作。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这是关于如何调试一般问题的评论,而不是对问题的回答。
    猜你喜欢
    • 2012-05-01
    • 2019-04-23
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2011-10-30
    相关资源
    最近更新 更多