我有两个别名:
alias rm='python my/rm/script.py '
alias docker='sudo docker '
问题是,当运行该语句时,$ docker rm ARGS
关键字rm
被扩展为别名,并且 docker 抱怨'python' is not a docker command.
我寻找了几个解决方案。一种解决方案是使用command
关键字。另一种是用于shopt
切换别名扩展。我无法充分利用它们。
这两个都不适合我:
alias docker='shopt -u expand_aliases; sudo docker '
alias docker='command sudo docker '
Unalias 的工作原理:
alias docker='unalias rm; sudo docker '
unalias 的问题是,过了一段时间,我会忘记我的 rm 别名不再存在于正在运行的 shell 环境中,无论我的 docker 命令已被执行。因此,我rm
在文件上使用时会立即删除它,而我的 python 脚本则充当安全网并将要删除的文件移动到垃圾箱中。我想避免陷入这种情况,即我错误地最终使用了 GNU rm 命令而不是我的 rm 别名,这就是我不想使用 unalias 的原因。
另一个解决方案是放弃 docker 别名。缺点是我必须sudo
为我想要执行的每个有用的 docker 命令编写关键字。这是一件苦差事,我避免使用 docker 的别名。
另一种解决方案是转义 rm 关键字,如下所示:
docker \rm ARGS
这有效。但我希望这里有一个“一劳永逸”的解决方案,这样我就可以自然地执行我的 docker 命令,而无需担心其他任何事情。
考虑到上述限制,如何在 rm 和 docker 中使用别名,但防止rm
关键字在 docker 命令中扩展为别名?
答案1
rm
在别名之后使用别名时会扩展别名的原因docker
是因为别名的定义docker
在末尾包含一个空格。在别名定义末尾添加一个空格是这要求 shell 将别名扩展应用于下一个单词的方法。
解决方案:定义docker
别名时不要在末尾添加空格。您可能还想删除其他别名末尾的空格。
docker
您也可以通过将用户添加到组中来完全摆脱别名docker
,但这是您在本地做出的管理决定。