Я столкнулся с этой интересной проблемой при заполнении моей панели 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: читать: arg count
Конечно, это можно исправить, назначив наш результат удачи переменной, затем используя xsetroot с указанной переменной. Но я все еще хотел бы понять, почему это не работает в сценарии.
Я понимаю, что каждая команда по обе стороны конвейера выполняется внутри своей собственной оболочки, но не вижу, как их локализованные переменные могут повлиять на цикл чтения. Или переменные выходят за рамки даже между циклами?
Что мне не хватает?
Обновление:sh
я связан с тиром, который находится в процессе сделал POSIX - совместимым. Используя более почтенный bash
решил это.
источник
read
можно было вызывать без переменной: pubs.opengroup.org/onlinepubs/9699919799/utilities/read.htmlОтветы:
Похоже, вы запускаете первый пример
bash
, а второй - во всем, на что указывает указатель/bin/sh
, - это оболочка POSIX, требующая передачи аргумента, указывающего переменную, в которую вы хотите поместить ввод. Изменение Шебанга#!/bin/bash
должно исправить это.источник
sh
иbash
./bin/sh
к bash, но думаю, что теперь я буду использовать bash напрямую, чтобы избежать двусмысленности. Спасибо :)В синтаксисе sh вам нужно
Некоторые оболочки, такие как ksh, bash и zsh, позволяют
read
вызываться без имени переменной, но поведение между ними различается. Смотрите, например, выводразличающиеся по всем bash, zsh, pdksh и ksh93
источник