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

Я столкнулся с этой интересной проблемой при 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 решило это.

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

  • Выполнение сценария оболочки
  • Проблема с bash-скриптом при запуске с панели запуска
  • извлечение строки bash
  • Сценарий, который удаляет нежелательные символы из переменной
  • Сценарий оболочки для удаления нескольких файлов
  • сопоставление sed шаблонов с удалением по строке
  • Почему программированию на C не нужны сценарии компилятора и оболочки?
  • Синтаксис замещения процесса
  • shell-скрипты все еще работают без #! (строка sha-bang)
  • сценарий оболочки отлично работает при выполнении в терминале, но ошибки при запуске как параллельная программа
  • bash + как увеличивать переменные, содержащие буквы a..z
  • Bash не ищет источник ~ / .bash_profile в OSX
  • Interesting Posts

    Почему передача секретов через переменные среды считается «крайне небезопасной»?

    Предложения в закладки слишком медленны в Firefox

    Автоматический вход на несколько корневых терминалов SSH

    Авторизация в SSH-соединении в OneLine

    Изменение рендеринга шрифтов после обновления с Fedora 25 до 26

    Можно ли восстановить восстановленные файлы?

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

    С mv, можно установить временную зависимость от файлов mv'ed?

    Перенос jvm в пространство ядра?

    фильтрация данных на основе разделителя в оболочке

    Установка драйверов AMD GPU на Fedora 18

    dpkg жалуется на отсутствующий пакет, который уже установлен

    Makefile компилирует неизменные файлы

    a.out – сегмент данных и текстовый сегмент являются смежными, если текстовый сегмент не используется совместно. Почему это так?

    Как слушать радиоприемник?

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