/ / bash file descriptor redirection - bash

bash file descriptor redirection - bash

Ich habe die folgenden zwei Bash-Skripte:

one.bash:

#!/bin/bash

echo "I don"t control this line of output to stdout"

echo "I don"t control this line of output to stderr" >&2

echo "I do control this line of output to fd 5" >&5

callone.bash:

#!/bin/bash

# here I try to merge stdout and stderr into stderr.
# then direct fd5 into stdout.

bash ./one.bash 1>&2 5>&1

Wenn ich es so laufe: bash callone.bash 2>stderr.txt >stdout.txt

Die Datei stderr.txt sieht folgendermaßen aus:

I don"t control this line of output to stdout
I don"t control this line of output to stderr
I do control this line of output to fd 5

und stdout ist leer.

Ich möchte, dass die "do control" Zeile nur an stdout.txt ausgegeben wird.

Die Einschränkungen für Änderungen sind:

  1. Ich kann alles in callone.bash ändern.
  2. Ich kann die Zeile in einem ändern.Base, die ich kontrolliere.
  3. Ich kann eine exec in one.bash hinzufügen, die sich auf den Dateideskriptor 5 bezieht.
  4. Ich muss das Skript wie angegeben ausführen.

[EDIT] Der Anwendungsfall dafür ist: Ich habe ein Skript, das alle Arten von anderen Skripten ausführt, die auf stderr und stdout ausgeben können. Aber ich muss sicherstellen, dass der Benutzer nur die gut kontrollierte Nachricht sieht. Also sende ich die gut kontrollierte Nachricht an fd5, und alles andere (stdout & stderr) wird an das Protokoll gesendet.

Antworten:

7 für die Antwort № 1

Umleitungen passieren in Ordnung.

Sobald du gelaufen bist 1>&2 du hast fd 1 durch fd 2 ersetzt.

Also wenn du dann rennst 5>&1 Sie leiten fd 5 dorthin um, wo fd 1 Punkte hat jetzt (nicht wo es war als es anfing).

Sie müssen die zwei Umleitungen invertieren:

bash ./one.bash 5>&1 1>&2