Macos &引用;回声-n“;使用bash执行脚本时效果良好,但使用sh时效果不佳

Macos &引用;回声-n“;使用bash执行脚本时效果良好,但使用sh时效果不佳,macos,bash,echo,Macos,Bash,Echo,为什么sh UsersInput.sh给出的输出与bash UsersInput.sh不同 我的脚本如下: #!/bin/bash echo -n "Enter: "; read usersinput; echo "You entered, \"$usersinput\""; bash localhost:Bash henry$Bash UsersInput.sh 输入:输入 您输入了“输入” sh localhost:Bash henry$sh UsersInput.sh -n输入: 输

为什么
sh UsersInput.sh
给出的输出与
bash UsersInput.sh
不同

我的脚本如下:

#!/bin/bash
echo -n "Enter: ";
read usersinput;
echo "You entered, \"$usersinput\""; 
bash

localhost:Bash henry$Bash UsersInput.sh
输入:输入
您输入了“输入”
sh

localhost:Bash henry$sh UsersInput.sh
-n输入:
输入
您输入了“输入”

为什么
-n
可以正确地处理第一个,而不能处理第二个?出现这种情况的原因是什么?是否有解决办法?

来自《人类回声》(man echo):

某些shell可能提供与此实用程序类似或相同的内置echo命令。最值得注意的是,sh(1)中的内置echo不接受-n选项。请参阅内置(1)手册页面


在bash中,Bourne shell,
echo
接受
-n
选项,而在sh中,Bourne shell,
echo
不接受,因此它只是回显您编写的所有内容,包括来自
man echo
的-n

某些shell可能提供与此实用程序类似或相同的内置echo命令。最值得注意的是,sh(1)中的内置echo不接受-n选项。请参阅内置(1)手册页面


在bash中,Bourne shell,
echo
接受
-n
选项,而在sh中,Bourne shell,
echo
不接受,因此它只是回显您编写的所有内容,包括-n。

/bin/sh是OS X上bash的一个版本(不是Bourne shell)。它启用了POSIX模式,并且还具有一个。其中之一是默认启用xpg_echo shell选项,以便内置echo符合POSIX

:

实现不支持任何选项

:

44。启用xpg_echo选项时,Bash不会尝试将echo的任何参数解释为选项。转换转义字符后,将显示每个参数

[……]

如上所述,Bash要求启用xpg_echo选项,以使echo内置完全一致

您可以取消设置xpg_echo,使用/bin/echo,或者最好只使用printf:

sh -c 'shopt -u xpg_echo; echo -n aa'
sh -c '/bin/echo -n aa'
sh -c 'printf %s aa'

/bin/sh是OSX上bash的一个版本(不是BourneShell)。它启用了POSIX模式,并且还具有一个。其中之一是默认启用xpg_echo shell选项,以便内置echo符合POSIX

:

实现不支持任何选项

:

44。启用xpg_echo选项时,Bash不会尝试将echo的任何参数解释为选项。转换转义字符后,将显示每个参数

[……]

如上所述,Bash要求启用xpg_echo选项,以使echo内置完全一致

您可以取消设置xpg_echo,使用/bin/echo,或者最好只使用printf:

sh -c 'shopt -u xpg_echo; echo -n aa'
sh -c '/bin/echo -n aa'
sh -c 'printf %s aa'

哪个贝壳是你的“sh”?/bin/sh指向什么?为了实现最大的可移植性,使用printf时不加换行:
printf“Enter:”
@glennjackman我将开始使用它。谢谢哪个贝壳是你的“sh”?/bin/sh指向什么?为了实现最大的可移植性,使用printf时不加换行:
printf“Enter:”
@glennjackman我将开始使用它。谢谢谢谢你提供的信息。我将开始使用glenn建议的
printf
。/bin/sh不是OS X上的Bourne shell。它是符合POSIX的bash版本。/bin/sh和/bin/bash二进制文件几乎相同,但大多数差异(包括echo的行为)取决于调用shell时使用的名称。感谢您提供的信息。我将开始使用glenn建议的
printf
。/bin/sh不是OS X上的Bourne shell。它是符合POSIX的bash版本。/bin/sh和/bin/bash二进制文件几乎相同,但大多数差异(包括echo的行为)取决于调用shell时使用的名称。