如果命令是子流程程序的结果,bash如何搜索程序

时间:2019-03-27 03:09:02

标签: bash shell zsh

我大约在一分钟前在 zsh 中玩游戏,我跑了这个游戏并感到困惑

`echo ls`

它返回了鹳ls结果(我的.zshrc中没有别名),没有着色,没有排序。

我认为ls只是从 non-interactive 子shell返回的文本,并且该文本应在当前shell中作为交互式shell命令运行。为什么不使用我的别名?

我在 bash 中尝试过,结果是一样的。我不知道在这种情况下shell如何实际搜索命令。

2 个答案:

答案 0 :(得分:3)

问题在于别名不是命令。它们本质上是简单的解析时前缀替换。

这意味着它们仅在输入 的命令以别名文本开头时才适用(即,不是,就像输入的一样):

ls   # Uses ls alias because it starts with ls
\ls  # No alias. It executes ls but starts with \l
"ls" # No alias. It executes ls but starts with "l
`echo ls` # No alias. It executes ls but starts with `e

如果您想要一个自定义的命令,该命令在执行时应用 而不是仅在输入时应用,请使用以下函数:

ls() { command ls --myflags "$@"; }

答案 1 :(得分:0)

the excellent answer by that other guy中所述,zsh中的常规别名不适用于作为命令运行时的命令替换或变量扩展的输出,也不适用于在命令名称后出现的常规文本(如选项和参数) )。但是, Global 别名仍然会影响命令名称后面的文本。因此,例如,如果lsls --color的全局别名,则`echo ls`可能变成`echo ls --color`

$ alias -g ls='ls -1rt'
$ `echo ls`
opt
installer.failurerequests
System
...
$ echo `echo ls`
ls -1rt

这使global aliases的使用风险很大:

  

最后一个示例显示了全局别名的危险之一;他们有   很有可能引起混乱。例如,如果您定义了   称为|的全局别名(可能),zsh将开始起作用   很奇怪每个管道符号将被替换为   您的别名。在某种程度上,全局别名就像C中的宏。   建议在使用它们以及为其选择名称时要谨慎。