【问题标题】:bash: unable to set and use alias in the same linebash:无法在同一行中设置和使用别名
【发布时间】:2016-11-26 08:48:49
【问题描述】:

我希望第二行是 foo 而不是 command not found

$ alias foo="echo bac" ; foo;
-bash: foo: command not found
$ foo
bac
$

为什么第二行不写foo?使用以下 shell 进行测试,行为相同:

  • bash 3.2.5
  • zsh 5.0.8
  • 破折号 0.5.9
  • busybox 1.25.0

【问题讨论】:

    标签: bash zsh busybox dash-shell


    【解决方案1】:

    Bash Reference Manual(强调我的)中描述了您所看到的行为:

    关于别名的定义和使用的规则有些混乱。在执行该行的任何命令之前,Bash 总是至少读取一个完整的输入行。别名在读取命令时扩展,而不是在执行命令时扩展。因此,与另一个命令出现在同一行的别名定义在读取下一行输入之前不会生效。该行别名定义后面的命令不受新别名的影响。

    大概其他的 shell 也有这种行为。

    【讨论】:

      【解决方案2】:

      要在 bash 的同一行中设置和使用alias,可以使用:

      eval $'alias df5=df\ndf5 -h'
      

      (学分:Hauke Laging's workaround + Kusalananda's workaround)。


      命令说明:

      • 根据 bash 手册中的Tom Fenechpointed out,由于“与另一个命令出现在同一行的别名定义在读取下一行输入之前不会生效”,因此我们使用eval 和在 alias 定义和它的使用之间添加一个新行。
      • 来自Kusalanandaworkaround

        $'...' 是一个“C 字符串”,bash 会将其中的\n 扩展为文字换行符,然后再将其传递给eval

      【讨论】:

        猜你喜欢
        • 2019-04-21
        • 1970-01-01
        • 2010-10-05
        • 2016-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多