“echo -n” works fine when executing script with ba

2019-01-28 17:05发布

问题:

How come sh UsersInput.sh gives a different output compared to bash UsersInput.sh?

My script is below:

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

bash

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

sh

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

How come -n behaves properly with the first, but not with the second? What's the reason for this and is there a workaround?

回答1:

From man echo:

Some shells may provide a builtin echo command which is similar or identical to this utility. Most notably, the builtin echo in sh(1) does not accept the -n option. Consult the builtin(1) manual page.

In bash, the Bourne-again shell, echo accepts the -n option whereas in sh, the Bourne shell, echo does not, so it simply echos everything you wrote, including the -n.



回答2:

/bin/sh is a version of bash (not a Bourne shell) on OS X. It has POSIX mode enabled and has a few other changes as well. One of them is that the xpg_echo shell option is enabled by default so that the builtin echo conforms to POSIX.

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

Implementations shall not support any options

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

44. When the xpg_echo option is enabled, Bash does not attempt to interpret any arguments to echo as options. Each argument is displayed, after escape characters are converted.

[...]

As noted above, Bash requires the xpg_echo option to be enabled for the echo builtin to be fully conformant.

You can unset xpg_echo, use /bin/echo, or preferably just use printf:

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


标签: macos bash echo