【问题标题】:How does bash search for program if command is a result from subprocess program如果命令是子进程程序的结果,bash如何搜索程序
【发布时间】:2019-03-27 03:09:01
【问题描述】:

大约一分钟前我刚刚在 zsh 中玩游戏,然后我运行了这个并感到困惑

`echo ls`

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

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

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

【问题讨论】:

    标签: bash shell zsh


    【解决方案1】:

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

    这意味着它们仅适用于 as entered 以别名文本开头的命令(即 not 执行时,就像输入的那样):

    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 "$@"; }
    

    【讨论】:

      【解决方案2】:

      the excellent answer by that other guy 中所述,zsh 中的正常别名不适用于作为命令运行时的命令替换或变量扩展的输出,或出现在命令名称之后的正常文本(如选项和参数)。但是,全局 别名仍然会影响命令名称之后的文本。因此,例如,如果 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 中的宏; 在使用它们和为它们选择名称时建议谨慎。

      【讨论】:

        猜你喜欢
        • 2015-12-27
        • 2015-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-08
        相关资源
        最近更新 更多