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.
fonte
read
ser invocable sem uma variável: pubs.opengroup.org/onlinepubs/9699919799/utilities/read.htmlRespostas:
Você parece estar executando o primeiro exemplo em
bash
, e o segundo no que quer que seja apontado por/bin/sh
, que é um shell POSIX que requer que um argumento seja passado especificando a variável na qual você deseja inserir a entrada. Alterar o shebang para#!/bin/bash
deve corrigir isso.fonte
sh
ebash
./bin/sh
ao bash, mas acho que eu usaria o bash diretamente a partir de agora, para evitar ambiguidade. Obrigado :)Na sintaxe sh, você precisa
Alguns shells como ksh, bash e zsh permitem
read
ser chamados sem um nome de variável, mas o comportamento difere entre eles. Veja, por exemplo, a saída dediferindo em todos os bash, zsh, pdksh e ksh93
fonte