当别名作为参数传递时防止别名扩展

Fir*_*ord 3 alias

我有两个别名:

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 命令中扩展为别名?

Kus*_*nda 7

rm在别名之后使用别名时会扩展的原因docker是别名的定义docker末尾包含一个空格。在别名定义末尾放置一个空格是要求shell 将别名扩展应用于下一个单词的方法。

解决方案:定义docker别名时不要在末尾添加空格。您可能还想删除其他别名末尾的空格。

docker您也可以通过将用户添加到组中来完全摆脱别名docker,但这是您在本地做出的管理决定。