GNU/Linux >> Linux Esercitazione >  >> Linux

Perché questo "durante la lettura" funziona in un terminale, ma non in uno script di shell?

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.


Linux
  1. Perché la sostituzione del processo Bash non funziona con alcuni comandi?

  2. Linux – Perché Setuid non funziona??

  3. Linux:perché Locale Es_mx funziona ma non Es?

  4. Perché il documento Parent Shell Here non funziona per il sottocomando in Dash ma Bash funziona?

  5. Qualsiasi modo per uscire dallo script bash, ma non uscire dal terminale

Perché `esce &` non funziona?

Perché find -exec mv {} ./target/ + non funziona?

Perché questa pipeline di shell termina?

Perché la modifica di javascript negli Strumenti per sviluppatori di Chrome non funziona?

Perché 'dd' non funziona per la creazione di USB avviabile?

Perché SUID è disabilitato per gli script di shell ma non per i file binari?