Eu me deparei com esse problema interessante enquanto preenchia minha barra WM com texto informativo, que é aplicado definindo o título da janela raiz, ou seja, xsetroot -name "clever words"
Para esse fim, imprimir uma fortuna funciona bem em um terminal:
fortune -s | while read -r; do xsetroot -name "$REPLY"; done
No entanto, o mesmo falha quando executado a partir de um script de shell:
#!/bin/sh
cat /tmp/afile | while read; do echo "$REPLY"; done
Produz:
$ sh afilereader
afilereader: 2: leia: arg count
É claro que isso é remediado atribuindo nosso resultado da sorte a uma variável e depois usando xsetroot com a referida variável. Mas eu ainda gostaria de entender por que isso não funciona em um script.
Percebo que cada comando em ambos os lados do pipeline é executado dentro de seu próprio subshell, mas não consigo ver como suas variáveis localizadas podem afetar o loop while read. Ou as variáveis estão fora do escopo mesmo entre as iterações do loop?
o que estou perdendo?
Atualização: O que sh
eu usei está vinculado ao traço, que está no processo de tornar-se compatível com POSIX. Usando o mais venerável bash
resolveu isso.
read
ser invocable sem uma variável: pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html