Sie können Dinge nicht direkt an eine solche Bash-Funktion leiten, aber Sie können read
verwenden um es stattdessen hineinzuziehen:
jc_hms() {
while read -r data; do
printf "%s" "$data"
done
}
sollte das sein, was du willst
Um Ihre eigentliche Frage zu beantworten:Wenn sich eine Shell-Funktion am empfangenden Ende einer Pipe befindet, wird die Standardeingabe von all geerbt Befehle in der Funktion, aber nur Befehle, die tatsächlich von ihrer Standardeingabe lesen, verbrauchen Daten. Bei Befehlen, die nacheinander ausgeführt werden, können spätere Befehle nur sehen, was nicht von vorherigen Befehlen verbraucht wird. Wenn zwei Befehle parallel ausgeführt werden, welche Befehle welche Daten sehen, hängt davon ab, wie das Betriebssystem die Befehle plant.
Seit printf
der erste und einzige Befehl in Ihrer Funktion ist, wird die Standardeingabe effektiv ignoriert. Es gibt mehrere Möglichkeiten, dies zu umgehen, einschließlich der Verwendung von read
eingebaut, um die Standardeingabe in eine Variable einzulesen, die an printf
übergeben werden kann :
jc_hms () {
read foo
hr=$(($foo / 3600))
min=$(($foo / 60))
sec=$(($foo % 60))
printf "%d:%02d:%02d" "$hr" "$min" "$sec"
}
Da Ihr Bedarf an einer Pipeline jedoch von Ihrer wahrgenommenen Notwendigkeit abzuhängen scheint, awk
zu verwenden , lassen Sie mich die folgende Alternative vorschlagen:
printstring=$( jc_hms $songtime )
Seit songtime
aus einem durch Leerzeichen getrennten Zahlenpaar besteht, führt die Shell eine Worttrennung für den Wert von songtime
durch , und jc_hms
sieht zwei getrennte Parameter. Dies erfordert keine Änderung in der Definition von jc_hms
, und es muss nichts über die Standardeingabe hineingeleitet werden.
Wenn Sie noch einen anderen Grund für jc_hms
haben um die Standardeingabe zu lesen, teilen Sie uns dies bitte mit.
1) Ich weiß, dass dies ein ziemlich alter Beitrag ist
2) Mir gefallen die meisten Antworten hier
Ich habe diesen Beitrag jedoch gefunden, weil ich etwas Ähnliches brauchte. Während sich alle einig sind, dass stdin verwendet werden muss, fehlt den Antworten hier die tatsächliche Verwendung der Datei /dev/stdin.
Die Verwendung des eingebauten read erzwingt die Verwendung dieser Funktion mit Pipe-Eingabe, sodass sie nicht mehr auf typische Weise verwendet werden kann. Ich denke, dass die Verwendung von /dev/stdin eine bessere Möglichkeit ist, dieses Problem zu lösen, also wollte ich der Vollständigkeit halber meine 2 Cent hinzufügen.
Meine Lösung:
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 Aktion:
[email protected]:pwd$ jc_hms 7800
02:10:00
[email protected]:pwd$ echo 7800 | jc_hms
02:10:00
Ich hoffe, das kann jemandem helfen.
Viel Spaß beim Hacken!
Oder Sie können es auch auf einfache Weise tun.
jc_hms() {
cat
}
Obwohl alle bisherigen Antworten die Tatsache außer Acht gelassen haben, dass dies nicht das war, was OP wollte (er gab an, dass die Funktion vereinfacht ist)