Почему эхо -n не работает в оболочке на Mac? - PullRequest
0 голосов
/ 21 ноября 2018

Справочная страница для echo говорит:

 -n    Do not print the trailing newline character.  This may also be
       achieved by appending `\c' to the end of the string, as is done by
       iBCS2 compatible systems.  Note that this option as well as the
       effect of `\c' are implementation-defined in IEEE Std 1003.1-2001
       (``POSIX.1'') as amended by Cor. 1-2002.  Applications aiming for
       maximum portability are strongly encouraged to use printf(1) to
       suppress the newline character.

Однако в sh на Mac это не работает:

sh-3.2$ echo $0
/bin/sh
sh-3.2$ which echo
/bin/echo
sh-3.2$ echo -n foo
-n foo

В * работает правильно1009 *:

bash-3.2$ echo $0
bash
bash-3.2$ which echo
/bin/echo
bash-3.2$ echo -n foo
foobash-3.2

FWIW это, кажется, происходит только на Mac, в Linux это работает правильно:

$ echo $0
sh
$ echo -n foo
foo$

1 Ответ

0 голосов
/ 21 ноября 2018

-n является расширением bash до echo.В версии 3.2 (которая поставляется с macOS) bash не поддерживает расширение, когда вызывается как sh.Начиная с версии 4.0 (какая-то версия, скорее всего, на вашем компьютере с Linux), bash делает честь -n, когда вызывается как sh.

Обновление: xpg_echoопция определяет, является ли встроенный в bash echo POSIX-совместимым или нет.В bash 3.2 (или, по крайней мере, в сборке macOS версии 3.2) этот параметр по умолчанию включен;в bash 4.x по умолчанию отключено.

% sh -c 'shopt xpg_echo'
xpg_echo        on
% ./sh -c 'shopt xpg_echo'
xpg_echo        off

(./sh - символическая ссылка на /usr/local/bin/bash, локальная установка bash 4.4 на моем компьютере.)

...