Nehmen wir an, ich habe ein main.sh
Skript, das über eine Subshell one.sh
aufrufen wird.Bash Subshell konsumiert Stdin des übergeordneten Prozesses
one.sh
:
#! /bin/bash
set -euo pipefail
(if [ -t 0 ]; then
echo "one little two little three little buses"
else
cat -
fi) | awk '{ $1 = "111"; print $0 }'
main.sh
:
#! /bin/bash
set -euo pipefail
main() {
echo "one_result) $(./one.sh)"
echo "one_piped) $(echo "the quick brown fox" | ./one.sh)"
}
main
nun jeder von ihnen wie erwartet funktioniert:
$ ./one.sh
111 little two little three little buses
$ ./main.sh
one_result) 111 little two little three little buses
one_piped) 111 quick brown fox
Aber, wenn ich Rohr etwas zu main.sh
, war ich nicht erwarten (oder besser gesagt, ich will nicht) one.sh
über den verrohrt Inhalt wissen, weil ich dachte, one.sh
war in seiner eigenen Subshell in one_result)
:
$ echo "HELLO WORLD MAIN" | ./main.sh
one_result) 111 WORLD MAIN
one_piped) 111 quick brown fox
Ist es der Fall, mein if
Zustand in one.sh
ist nicht das, was ich will? Ich möchte one.sh
keine Nebenwirkungen von der Verwendung meiner main.sh
's stdin erstellen - seit jetzt hat es verbraucht, meine main.sh
ist jetzt effektiv stdin
-less, wie Stdin kann nur einmal gelesen werden, es sei denn ich es weg speichern.
Gedanken? TIA.
Eine mögliche Abhilfe: set 'one.sh' 'STDIN zu'/dev/null ', so dass es nicht von "stehlen" kann Die Eingabe des Elternteils. Das Ergebnis würde folgendermaßen aussehen: $ (one.sh dev/null) ' –