Mi sono imbattuto in questo interessante problema mentre riempivo la mia barra WM con un testo informativo, che viene applicato impostando il titolo della finestra principale, ovvero xsetroot -name "clever words"
A tal fine, stampare una fortuna funziona bene in un terminale:
fortune -s | while read -r; do xsetroot -name "$REPLY"; done
Eppure lo stesso non riesce quando viene eseguito da uno script di shell:
#!/bin/sh
cat /tmp/afile | while read; do echo "$REPLY"; done
Produce:
$ sh afilereader
afilereader:2:read:arg count
Ovviamente questo viene risolto assegnando il nostro risultato fortuna a una variabile, quindi usando xsetroot con detta variabile. Ma mi piacerebbe ancora capire perché questo non funziona in uno script.
Mi rendo conto che ogni comando su entrambi i lati della pipeline viene eseguito all'interno della propria subshell, ma non riesco a vedere come le loro variabili localizzate potrebbero influenzare il ciclo di lettura while. Oppure le variabili sono fuori dall'ambito anche tra le iterazioni del ciclo?
Cosa mi sto perdendo?
Aggiornamento: Il sh
Ho usato è collegato a dash, che è in procinto di essere reso conforme a POSIX. Usando il più venerabile bash
risolto.
Risposta accettata:
Sembra che tu stia eseguendo il primo esempio in bash
, e il secondo in ciò a cui punta /bin/sh
, che è una shell POSIX che richiede il passaggio di un argomento specificando la variabile in cui si desidera inserire l'input. Modificare lo shebang in #!/bin/bash
dovrebbe risolvere questo problema.