别名 bashrc 中的空格

别名 bashrc 中的空格

我使用巴什

我编写了一个命令,用于仅打印 docker id,并在一行上用空格分隔。

docker ps -a | grep -E '^[a-z0-9]{12}' -o | awk '{printf "%s ",$0} END {print ""}'

效果很好,所以我决定将其设为别名。

首先,看来这里的空白"%s "是一个问题,所以我决定转义它

新命令如下所示:

docker ps -a | grep -E '^[a-z0-9]{12}' -o | awk '{printf "%s\ ",$0} END {print""}'

现在,获取 .bashrc 时没有错误,但当我尝试运行我的别名时,出现以下错误:

{printf %s ,-bash} END {print}
        ^ syntax error

我已经看过这个鱼:别名中的空格但我没有用鱼

编辑,我的别名如下所示:

alias dockerid="docker ps -a | grep -E '^[a-z0-9]{12}' -o | awk '{printf "%s\ ",$0} END {print""}'"

请注意,如果我使用单引号,则 source 命令会失败

答案1

这就是为什么bash手册说

对于几乎所有用途,shell 函数都优于别名。

dockerid() {
    docker ps -a \
    | grep -o -E '^[a-z0-9]{12}' \
    | awk '{printf "%s ",$0} END {print ""}'
}

尽管别名引用地狱通过替换awk为而消失paste

alias dockerid="docker ps -a | grep -o -E '^[a-z0-9]{12}' | paste -d ' ' -s"

答案2

除了使用之外,docker ps -a | grep -E '^[a-z0-9]{12} -o | ...'您还可以使用:

docker ps -a --format '{{.ID}}' | xargs

或使用别名(我更喜欢函数)

alias dockerid='docker ps -a --format "{{.ID}}" | xargs'

答案3

问题是你有"一个"带引号的字符串。正如你在问题中看到的(查看语法突出显示),第一个,内部"被视为结束"。因此,你需要转义内部引号,并且还要转义内部\,如下所示:

alias dockerid="docker ps -a | grep -E '^[a-z0-9]{12}' -o | awk '{printf \"%s\\ \",$0} END {print \"\"}'"

答案4

问题是您使用单引号 (') 来括住调用别名时要运行的整个命令,但您也在命令本身中使用单引号。这导致 shell 将命令中的单引号解释为别名定义的一部分,而不是应运行的命令的一部分。

要解决此问题,您可以使用双引号 (") 而不是单引号来括住整个命令。这将允许 shell 将命令中的单引号解释为命令本身的一部分,而不是别名定义的一部分。

alias dockerid="docker ps -a | grep -E '^[a-z0-9]{12}' -o | awk '{printf "%s\ ",$0} END {print\"\"}'"

这应该适合你的情况。

相关内容