GNU/Linux >> Linux Esercitazione >  >> Linux

Chiarimento relativo al comportamento dello script della shell insieme alla pipe

Stai confondendo argomenti e input standard. Inviare dati a un programma non equivale a fornirgli argomenti da riga di comando.

Nel tuo primo caso, non stai passando argomenti al tuo script, ma solo alimentando i dati attraverso il suo flusso di input standard. Quindi $1 non è impostato per l'intera durata dello script.
La prima invocazione di more quindi non ha parametri e impagina lo standard input. Questo mostra ciò che avevi reindirizzato lì (dir1 , come testo). Il successivo echo stampa solo una nuova riga poiché non ottiene nulla da stampare e l'ultimo more non ha più niente da stampare - l'input standard è stato "prosciugato" dal primo.

Nel secondo caso, passi un argomento. Quindi $1 ha il valore dir2 nella sceneggiatura. Succede la stessa cosa, tranne per il primo more entrambi:

  • pagine attraverso entrambi gli input standard
  • tenta di impaginare il file dir2 ed errori poiché quella è una directory

L'eco fa quello che ci si aspetta dato che $1 contiene dir2 e l'ultimo more solo errori su dir2 - non ha nulla da leggere dallo standard input.


La differenza sta negli "Argomenti " VS "Immissione standard ".

Quando esegui echo dir1 | bash script.sh , il $1 argomento nel tuo script.sh è sempre vuoto in quanto non viene fornito alcun argomento (prova ad aggiungere un set -x all'inizio e lo vedrai nell'output di debug). Il dir1 che viene ripetuto proviene dallo input standard come more comando read stdin se non viene fornito alcun argomento (ricorda $1 è vuoto).

Come cmd1 | cmd2 funziona

Quando si utilizza pipe :

  1. cmd2 è un sottoprocesso di cmd1 .
  2. lo stdin di cmd2 è "collegato" sullo stdout di cmd1 .

Poiché linux stdio lib offriva un flusso bufferizzato attraverso il descrittore di file, il contenuto di stdin verrà consumato (ovvero letto solo una volta) solo quando stdin verrà aperto .

Passo dopo passo cmd1 | cmd2 flusso di lavoro

Esempio di comando :

echo dir1 | (echo "a" ; read stdinvalue; echo "$stdinvalue")

  1. echo dir1 | :scrivi "dir1\n " sullo stdout del primo comando che non viene ripetuto ma memorizzato nel buffer tramite stdio e disponibile per il sottoprocesso tramite stdin.
  2. echo "a" :scrivi "a\n " su stdout; non legge stdin ! quindi il "dir1\n " la stringa è ancora disponibile
  3. read stdinvalue :legge stdin fino a EOL (o EOF) e memorizza la stringa in una variabile bash
  4. echo "$stdinvalue" :scrive il valore della variabile stdinvalue in stdout

Linux
  1. Quale interprete di shell esegue uno script senza Shebang?

  2. Passare il nome del file con spazi a uno script di shell?

  3. Lo script termina bruscamente con un messaggio terminato?

  4. Comportamento imprevisto di uno script di shell?

  5. Script di shell con funzione e parametro come variabili?

È possibile far interagire uno script di shell bash con un altro programma a riga di comando?

Modifica lo script della shell mentre è in esecuzione

Libreria di output di script di shell colorata

Directory di modifica dello script Shell con variabile

Aggiungi una riga al file /etc/hosts con lo script della shell

Creazione di modelli con Linux in uno script Shell?