GNU/Linux >> Linux Esercitazione >  >> Linux

Invia l'output alla funzione bash

Non puoi reindirizzare cose direttamente a una funzione bash del genere, tuttavia puoi usare read per inserirlo invece:

jc_hms() {
  while read -r data; do
      printf "%s" "$data"
  done
}

dovrebbe essere quello che vuoi


Per rispondere alla tua vera domanda, quando una funzione di shell si trova all'estremità ricevente di una pipe, l'input standard viene ereditato da all comandi nella funzione, ma solo i comandi che effettivamente leggono dal loro input standard consumano dati. Per i comandi che vengono eseguiti uno dopo l'altro, i comandi successivi possono vedere solo ciò che non viene consumato dai comandi precedenti. Quando due comandi vengono eseguiti in parallelo, quali comandi vedono quali dati dipendono da come il sistema operativo pianifica i comandi.

Dal printf è il primo e unico comando nella tua funzione, l'input standard viene effettivamente ignorato. Ci sono diversi modi per aggirare questo problema, incluso l'utilizzo del read incorporato per leggere l'input standard in una variabile che può essere passata a printf :

jc_hms () {
    read foo
    hr=$(($foo / 3600))
    min=$(($foo / 60))
    sec=$(($foo % 60))
    printf "%d:%02d:%02d" "$hr" "$min" "$sec"
}

Tuttavia, poiché la tua necessità di una pipeline sembra dipendere dalla tua necessità percepita di utilizzare awk , suggerisco la seguente alternativa:

printstring=$( jc_hms $songtime )

Dal songtime consiste in una coppia di numeri separati da spazi, la shell esegue la suddivisione in parole sul valore di songtime e jc_hms vede due parametri separati. Questo non richiede cambiamenti nella definizione di jc_hms , e non c'è bisogno di reindirizzare nulla tramite lo standard input.

Se hai ancora un motivo diverso per jc_hms per leggere l'input standard, faccelo sapere.


1) So che questo è un post piuttosto vecchio

2) Mi piacciono la maggior parte delle risposte qui

Tuttavia, ho trovato questo post perché avevo bisogno di qualcosa di simile. Mentre tutti concordano che stdin è ciò che deve essere utilizzato, ciò che manca nelle risposte qui è l'effettivo utilizzo del file /dev/stdin.

L'uso dell'integrato read forza l'utilizzo di questa funzione con l'input reindirizzato, quindi non può più essere utilizzato in modo tipico. Penso che utilizzare /dev/stdin sia un modo migliore per risolvere questo problema, quindi volevo aggiungere i miei 2 centesimi per completezza.

La mia soluzione:

jc_hms() { 
  declare -i i=${1:-$(</dev/stdin)};
  declare hr=$(($i/3600)) min=$(($i/60%60)) sec=$(($i%60));
  printf "%02d:%02d:%02d\n" $hr $min $sec;
}

In azione:

[email protected]:pwd$ jc_hms 7800
02:10:00
[email protected]:pwd$ echo 7800 | jc_hms 
02:10:00

Spero che questo possa aiutare qualcuno.

Buon hacking!


Oppure puoi anche farlo in modo semplice.

jc_hms() {
    cat
}

Sebbene tutte le risposte finora abbiano ignorato il fatto che questo non era ciò che OP voleva (ha affermato che la funzione è semplificata)


Linux
  1. Includere condizionatamente uno stage di pipe in uno script Bash?

  2. Dividi l'output del comando per colonne usando Bash?

  3. Utilizzo dell'output dei comandi precedenti in bash

  4. Bash cattura l'output di awk nell'array

  5. Come posso reindirizzare un file scaricato allo standard output in bash?

Come leggere i file riga per riga in Bash

Bash:Scrivi su file

Bash ha letto Comando

Funzioni Bash

Come leggere un file riga per riga in Bash

Shell Scripting Parte V:Funzioni in Bash