Linux shell 别名如何处理转义字符?

docker 很占用硬盘,我需要定期清理 Exit 的容器和 none 的镜像

我查阅到下面两个命令可以完成这件事情:

清理无用的容器:docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')

清理无用的镜像:docker rmi $(docker images -f "dangling=true" -q)

参考文章:
Docker这些none:none的镜像,难道就不配拥有名字吗

为了方便使用,我写了下面两个 shell 别名

alias clean_docker_none_images="docker rmi $(docker images -f "dangling=true" -q)"
alias clean_docker_unuse_containers="docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')"

但是这两个命令的别名没有使用:

╭─bot@mbp13m1.local ~
╰─➤ alias clean_docker_none_images 130 ↵
clean_docker_none_images='docker rmi '
╭─bot@mbp13m1.local ~
╰─➤ alias clean_docker_unuse_containers
clean_docker_unuse_containers='docker rm '

图片.png

貌似是被 ${ 等等符号转义掉了?

如何正确的别名使用?

阅读 9.5k
3 个回答

解决了,想下面那样就好了

# docker rmi $(docker images -f "dangling=true" -q)
alias clean_docker_none_images='docker rmi $(docker images -f "dangling=true" -q)'
# docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')
alias clean_docker_unuse_containers='docker rm $(docker ps -a | grep "Exited" | awk "{print \$1 }")'

注意,没有可清理的容器或者镜像就会提示少参数,这是正常的!

─➤  clean_docker_unuse_containers
"docker rm" requires at least 1 argument.
See 'docker rm --help'.

Usage:  docker rm [OPTIONS] CONTAINER [CONTAINER...]

Remove one or more containers

外层的双引号换成单引号

最外层要么使用单引号(避免字符串里面的命令替换$(xxx)被提前解析),要想使用双引号的话,里面的$需要转义处理\$(也是避免被解析)

另外你需要考虑引号嵌套的问题,简单来说最外层是单引号,里面最好都用双引号;反之最外层是双引号,里面全用单引号。

最外层是双引号时,在其他场合你还需要考虑各种转义,建议还是外层单引号省心。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题