我使用巴什
我编写了一个命令,用于仅打印 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\"\"}'"
这应该适合你的情况。