GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Pipe-Ausgabe zur Bash-Funktion

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)


Linux
  1. Ausgabe umleiten und leiten?

  2. Funktionen in Shell-Variablen?

  3. Eine Pipe-Stufe bedingt in ein Bash-Skript einschließen?

  4. Ausgabe des Befehls nach Spalten mit Bash aufteilen?

  5. Konvertieren Sie die Ausgabe von bash `ls` in ein json-Array

So lesen Sie Dateien Zeile für Zeile in Bash

Bash:In Datei schreiben

Bash las Befehl

Bash-Funktionen

So lesen Sie eine Datei Zeile für Zeile in Bash

Shell-Scripting Teil V:Funktionen in Bash