bash与sh脚本不同的结果
当我在macOS上的终端上运行这些线路时,我得到了正确的结果bash与sh脚本不同的结果,bash,shell,macos-sierra,Bash,Shell,Macos Sierra,当我在macOS上的终端上运行这些线路时,我得到了正确的结果 hex=$(echo -n 'betty' | xxd -p) echo $hex 6265747479 但是当我在bash脚本中运行它们时,我得到了完全不同的结果 sh myscript.sh 62657474790a 这就像是出于某种原因,它把一辆马车停在了终点。为什么?尝试bash而不是sh。由于echo是一个内置命令,它取决于shell如何执行。对我来说,来自sh的回声似乎不支持-n: sh-3.2$ echo -n
hex=$(echo -n 'betty' | xxd -p)
echo $hex
6265747479
但是当我在bash脚本中运行它们时,我得到了完全不同的结果
sh myscript.sh
62657474790a
这就像是出于某种原因,它把一辆马车停在了终点。为什么?尝试
bash
而不是sh
。由于echo
是一个内置命令,它取决于shell如何执行。对我来说,来自sh的回声似乎不支持-n
:
sh-3.2$ echo -n hello
-n hello
sh-3.2$ echo $(echo -n 'betty' | xxd -p)
2d6e2062657474790a
当将
-n
作为第一个参数时,不同版本的echo
会做不同的事情。有些人将其打印为输出的一部分,有些人将其解释为一个标志,谁知道会发生什么。根据“如果第一个操作数是-n
,或者如果任何操作数包含反斜杠字符,则结果由实现定义。”
使用printf
打印字符串后,不使用换行符打印字符串的最可靠方法。它稍微复杂一点,因为您必须给它一个格式字符串以及要打印的字符串:
hex=$(printf "%s" 'betty' | xxd -p)
不能复制。请添加
cat myscript.sh的输出;sh myscript.sh
@Peter:首先,这不是回车,而是换行。第二,似乎涉及到不同的炮弹。在第二个示例中,您提供了sh
作为shell,我们不知道sh在您的机器上链接到哪里。如果两者都是bash shell,那么它们可能是不同的版本(在两个变体中都使用print$bash_VERSION
),它们以不同的方式实现echo
。我很惊讶echo-n'betty'
将生成该输出,它似乎是betty
,后面是一个换行。我希望betty没有换行符,或者betty有换行符。与echo-nbetty
相比,sh-c'echo-nbetty'到底打印了什么?ls-l/bin/sh
说什么?sh-c'echo-n betty'
给我-n betty
echo-n betty
给我betty
下一个提示与bettyls-l/bin/sh
=-r-xr-xr-x 1根轮630464月29日10:31/bin/sh
我明白了,因此,即使它们是同一个命令,运行时(sic)也可以用不同的方式处理它们。