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)