3

sh UsersInput.sh与 相比,为什么会给出不同的输出bash UsersInput.sh

我的脚本如下:

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

重击

localhost:Bash henry$ bash UsersInput.sh 
Enter: input
You entered, "input"

localhost:Bash henry$ sh UsersInput.sh
-n Enter: 
input
You entered, "input"

为什么-n第一个行为正确,而第二个行为不正确?这是什么原因,是否有解决方法?

4

2 回答 2

4

来自man echo

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

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

于 2013-07-25T18:17:15.927 回答
2

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

http://pubs.opengroup.org/onlinepubs/009696799/utilities/echo.html

实现不应支持任何选项

http://www.gnu.org/software/bash/manual/bash.html#Bash-POSIX-Mode

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'
于 2013-07-25T18:34:48.753 回答