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