代码之家  ›  专栏  ›  技术社区  ›  zakmck

带有-e标志的回声的奇怪行为传递给带有-c标志的bash

  •  1
  • zakmck  · 技术社区  · 6 年前

    我无法理解这个bash脚本的行为(我把它从一个更实际的用例中去掉了):

    # This is test.sh
    cmd="echo -e \"\n\n\n\t===== Hello World =====\n\n\""
    sh -c "$cmd"
    

    它打印的是:

    $ ./test.sh
    -e
    
    
        ===== Hello World =====
    $
    

    如果我去掉-e标志,所有内容都会正确打印,引用的字符会正确解释,并且没有“-e”损坏:但不应该这样。

    我的重点是: GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17) 在MacOS下。

    3 回复  |  直到 6 年前
        1
  •  2
  •   chepner    6 年前

    在POSIX模式下(当运行为 sh ),请 bash 3.2的 echo 命令不接受选项; -e 只是另一个写入标准输出的参数。比较:

    $ bash -c 'echo -e "a\tb"'
    a   b
    $ sh -c 'echo -e "a\tb"'
    -e a    b
    

    两种情况下都会打印文本选项卡,因为posix 回声 行为与 猛击 echo -e .

    因此, printf 几乎总是比 回声 提供一致的行为。

    cmd='printf "\n\n\n\t===== Hello World =====\n\n"'
    sh -c "$cmd"
    
        2
  •  0
  •   DHRUV    6 年前

    SH-4.2 CAT测试.sh cmd=“echo-e\”\n \n \n \t===hello world===\n \n \“ sh-c“$cmd”

    SH-4.2/测试.sh

    ===== Hello World =====
    

    第4.2页#

    它正在我的机器上正确打印

        3
  •  0
  •   zakmck    6 年前

    好吧,我想是我自己找到的,从 here 以下内容:

    sh,伯恩贝壳,是旧的。其行为由POSIX标准指定。如果你想要新的行为,你可以使用bash,bourne外壳,它可以随时添加新的特性。在许多系统中,sh只是bash,当以该名称运行时,bash打开兼容模式。

    呻吟…