7 Stimmen

sh: Wie vermeide ich es, nummerierte Dateideskriptoren zu verklumpen?

Wenn ich

  exec 3>>file               # file descriptor 3 now points to file
  [ $dryrun ] && exec 3>&1   # or possibly to stdout
  echo "running">&3
  exec 3>&-                  # and is now closed

Ich mache mir Sorgen darüber, worauf der Dateideskriptor 3 außerhalb der fraglichen Funktion gezeigt haben könnte. Wie kann ich damit umgehen?

  • Gibt es eine eingebaute next_available_fd ?
  • Gibt es eine Möglichkeit, fd3 in eine Variable zu duplizieren, dann duplizieren Sie es zurück, sobald die Funktion ausgeführt wird?
    • und sollte ich über Threading und gleichzeitige Schreibvorgänge auf fd3 in diesem Fall sorgen?
  • Ich bin in sh, aber vielleicht hat bash/ksh/zsh eine Antwort auf dieses Problem?

1voto

trutheality Punkte 22482

Ich weiß nicht, ob etwas so einfach ist wie next_available_fd aber um die gewünschte Funktionalität zu erhalten (temporäres Umleiten eines Dateideskriptors, ohne ihn außerhalb der Funktion zu beeinflussen), kann man in der Bash (ich weiß nicht, wie es mit sh aussieht) wie folgt vorgehen:

exec 3>file3
exec 1>file1

echo "something">&3
echo "something else"

f31 () {
        echo "something">&3
}
f31 3>&1

f13 () {
        echo "something else"
}
f13 >&3

echo "something">&3
echo "something else"

Das Ergebnis file1 :

something else
something
something else

Und file3 :

something
something else
something

Dies zeigt, dass die Umleitung jeweils auf den Funktionsaufruf beschränkt ist.

0 Stimmen

Entschuldigung, welcher Teil Ihres Beispielcodes demonstriert was?

1voto

William Pursell Punkte 188248

Anstatt exec zu verwenden, um den Dateideskriptor innerhalb der Funktion umzuleiten, können Sie (mit Bash, ich habe es nicht mit anderen Shells ausprobiert) Folgendes tun:

foo() {
  test $dryrun && exec 3>&1
  echo running >&3
} 3>>file

foo
more\_commands

In diesem Setup wird "running" entweder in die Datei oder in den ursprünglichen stdout gehen, abhängig von $dryrun, und more_commands wird fd 3 haben, wie es vor dem Aufruf von foo war.

0voto

glenn jackman Punkte 221248

Wenn Ihr System die /proc Dateisystem, schauen Sie in /proc/$$/fd um zu sehen, was gerade benutzt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X