Почему это «пока прочитано» работает в терминале, но не в сценарии оболочки?

Я столкнулся с этой интересной проблемой при xsetroot -name "clever words" моей бары WM информационным текстом, который применяется путем установки заголовка корневого окна, то есть xsetroot -name "clever words"

С этой целью печать судьбы отлично работает в терминале:

 fortune -s | while read -r; do xsetroot -name "$REPLY"; done 

Тем не менее это не удается при запуске из сценария оболочки:

 #!/bin/sh cat /tmp/afile | while read; do echo "$REPLY"; done 

Производит:

$ sh afilereader
afilereader: 2: read: arg count

Конечно, это исправлено, присваивая результат нашей удачи переменной, затем используя xsetroot с указанной переменной. Но я все равно хотел бы понять, почему это не работает в скрипте.

Я понимаю, что каждая команда по обе стороны конвейера запускается внутри собственной подоболочки, но не видит, как их локализованные переменные могут повлиять на цикл while. Или переменные недоступны даже между итерациями цикла?

Что мне не хватает?

Обновление: sh я использовал, связан с тире, который находится в процессе выполнения POSIX. Использование более почтенного bash решило это.

  • Сценарий оболочки только для подсчета последовательных дней
  • Сценарий Bash не может распознавать переменную как часть пути
  • Как повернуть все изображения в каталоге с помощью imagemagick?
  • Как получить абсолютный путь от использования команды find unix
  • Порядок обработки и печать файлов с помощью find
  • Запустить сценарий и не потерять доступ к подсказке / терминалу
  • Использование find -exec и проблемы с перенаправлением стандартной ошибки
  • Неожиданная ошибка EOF и синтаксиса
  • 2 Solutions collect form web for “Почему это «пока прочитано» работает в терминале, но не в сценарии оболочки?”

    Вы, кажется, запускаете первый пример в bash , а второй – в том, на что указывает /bin/sh , который представляет собой оболочку POSIX, требующую передачи аргумента, задающего переменную, в которую вы хотите ввести вход. Чтобы изменить значение shebang на #!/bin/bash исправьте это.

    В синтаксисе sh вам нужно

     IFS= read -r REPLY 

    Некоторые оболочки, такие как ksh, bash и zsh, позволяют считать, что их вызывают без имени переменной, но поведение отличается от них. См. Например, вывод

     printf 'te\ st\\\na ' | "$shell" -c 'read; printf "%s\n" "<$REPLY>"' 

    по всем баш, zsh, pdksh и ksh93

    Interesting Posts

    безопасно / не опасно для ssh с ключами через открытый прозрачный прокси?

    Как избежать одиночных кавычек, правильно создающих псевдоним

    В OS X Darwin, почему я могу вмешиваться в ввод текста через пользовательские сеансы с помощью cat?

    Gzip удаляет значения ASCII

    Как искать всю историю bash без необходимости идти вперед и назад?

    Как отформатировать число с плавающей запятой с точностью до 2 значащих цифр в bash?

    Я владею сторожевым псом?

    Выполнение команд оболочки в файле .sh приводит к ошибке

    Что случилось с моим рабочим столом?

    Буферы TCP продолжают заполняться (Recv-Q full): он называется unresponsive

    Linux Mint не распознает свободное пространство, созданное Windows 10

    gentoo alsa pulseaudio – alsa mixer работает; aplay прямо к hw: 1,0 работ; aplay для любого из настроенных PCM не работает

    Поиск файлов с тем же именем, но с другим контентом?

    Устройство Usb-ethernet

    Загрузить ВСЕ rpms для продукта

    Linux и Unix - лучшая ОС в мире.