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

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

我有两个别名:

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,但这是您在本地做出的管理决定。

相关内容