Невидимое приглашение после глобального перенаправления stderr на / dev / null

{ echo "x1 x2 x3" ; echo "y1 y2 y3"; } | xargs -L1 echo

x1 x2 x3
y1 y2 y3

-L1 будет использовать каждую строку отдельно

Однако справочная страница портит ее:

Строка, оканчивающаяся на пробел продолжается до следующей непустой строки.

См. Здесь:

{ echo "x1 x2 x3 " ; echo "y1 y2 y3"; } | xargs -L1 echo

x1 x2 x3 y1 y2 y3
3
01.04.2018, 13:07
1 ответ

Это потому, что вы перенаправили стандартную ошибку оболочки.

Именно здесь совместимая с POSIX -оболочка должна писать свои интерактивные подсказки согласно стандарту.

  • The Bourne Again , Heirloom Bourne ,(Debian и FreeBSD)93 Korn , MirBSD Korn ,(FreeBSD , OpenBSD и Debian)PD Korn,(FreeBSD и Debian)Almquist и Watanabe все оболочки соответствовать в этом отношении и писать свои интерактивные подсказки в стандартную ошибку. Вы увидите отсутствие быстрого поведения со всеми из них.

    Однако поведение ввода без эха намного сложнее:

    • Оболочки Debian PD Korn, Debian Almquist и Heirloom Bourne не реализуют своих собственных редакторов строк, а полагаются на тот, который предоставляется дисциплиной строк терминала в ядре. Вы по-прежнему будете видеть то, что вы вводите, в качестве стандартного ввода.
    • Оболочки Watanabe, (FreeBSD 93, )Korn и (Debian 93, )Korn реализуют свои собственные строковые редакторы, которые также выводят стандартную ошибку, когда они (повторно -)отображать строки ввода по мере их редактирования. Тем не менее, они включают терминальное эхо на перед выполнением команды exec, и (, поскольку стандартная ошибка больше не является терминальным устройством ), не могут снова отключить его при вызове строки редактор для их следующего ввода. Таким образом, вы увидите, что дальнейший ввод, который вы вводите, будет отражен дисциплиной строки терминала, даже если вывод ввода из строкового редактора оболочки будет теперь перенаправлен на стандартную ошибку. Их построчные редакторы также ошибаются в некоторых тонкостях, например, не распознавая дальнейших изменений размера терминала.
    • MirBSD Korn, (FreeBSD PD )Korn,и (OpenBSD PD )Оболочки Korn реализуют свои собственные редакторы строк, которые (re -)отображают отредактированную строку в виде стандартной ошибки, но открывают другой дескриптор файла для /dev/ttyнапрямую, чтобы управлять такими вещами, как эхо терминала.. Им удается снова отключить эхо при вызове строкового редактора для следующего ввода. Таким образом, вы не увидите, что дальнейший ввод, который вы набираете, повторяется их линейными редакторами или дисциплиной терминальной линии.
    • Оболочки Bourne Again и FreeBSD Almquist реализуют свои собственные редакторы строк, которые (re -)отображают отредактированную строку в виде стандартной ошибки, но используют стандартный ввод для управления такими вещами, как эхо терминала. Им удается снова отключить эхо при вызове строкового редактора для следующего ввода. Таким образом, вы не увидите, что дальнейший ввод, который вы набираете, повторяется их линейными редакторами или конечной линейной дисциплиной.
  • Оболочки BusyBox Almquist и Z не соответствуют POSIX в этом отношении. Оба они реализуют свои собственные линейные редакторы. С обоими вы увидите поведение, которое это приложение заставляет вас поверить.

    • Линейный редактор оболочки BusyBox Almquist использует стандартный вывод для входного эха, и это также , где он записывает свои подсказки. На него просто не влияет перенаправление стандартной ошибки. Но вы можете получить эффект, перенаправив вместо этого стандартный вывод. Он использует стандартный ввод для распознавания изменений размера терминала.
    • Оболочка Z прилагает некоторые усилия, чтобы попытаться найти терминальное устройство для запуска ZLE, вплоть до явного открытия /dev/tty. Он дублирует дескриптор файла на терминальное устройство при запуске, и ZLE затем использует его для всего ; для повторения введенного текста, для чтения введенного текста, для записи интерактивных подсказок,и для включения и выключения эха терминала. Таким образом, на ZLE не влияет последующее перенаправление стандартной ошибки, вывода или даже ввода. Вы можете перенаправить все три на /dev/nullс помощью exec, если хотите, и оболочка Z по-прежнему будет интерактивно запрашивать и получать ввод.

(Оболочка Thompson не поддерживает командный механизм оболочки exec, в первую очередь, потому что он предшествует -его изобретению.)

Вы должны пожаловаться автору Стефану Шазела, что это приложение неправильное, чтобы оно могло быть исправлено.

Дополнительная литература

9
27.01.2020, 21:11

Теги

Похожие вопросы