Prägnante Möglichkeit zur Ausgabe in eine Datei, wenn ein Argument angegeben ist, andernfalls in die Standardausgabe

Prägnante Möglichkeit zur Ausgabe in eine Datei, wenn ein Argument angegeben ist, andernfalls in die Standardausgabe

Ich möchte, dass mein Skript die Ausgabe auf stdout ausgibt, sofern es keinen Dateinamen als Argument erhält. Ein offensichtlicher Weg ist wie folgt:

if [ -e "$1" ]; then
  command_with_output >$1
else
  command_with_output
fi

Es ist ziemlich hässlich und enthält Wiederholungen, daher hätte ich es gern auf eine prägnantere Art und Weise gemacht.

Ich habe Folgendes versucht, aber es funktioniert nicht.

[ -e "$1" ] && outfile=$1 || outfile='&1'
command_with_output >$outfile

Bearbeiten: Dies ändert nichts an der Relevanz der Antworten, aber nachdem ich die Frage gestellt hatte, wurde mir klar, dass dies touch "$1" && outfile=$1wirklich das ist, was ich brauche, anstatt [ -e "$1" ] && outfile=$1dass die Datei möglicherweise noch nicht existiert und ich sicherstellen möchte, dass ich darauf schreiben oder sie erstellen kann, nicht nur, dass sie existiert. Ich ändere die Frage nicht, weil dadurch die Antworten nicht mehr synchron wären.

Antwort1

execkann verwendet werden, um die Standardausgabe des aktuellen Skripts in eine andere Datei umzuleiten.

[ -e "$1" ] && exec > $1
command_with_output

Antwort2

$1Eine andere Möglichkeit besteht darin , als Dateinamen zu verwenden, wenn dieser übergeben wurde, und /dev/stdoutandernfalls (was unter Linux ein symbolischer Link ist /proc/self/fd/1und bei vielen anderen Unix-Varianten ein Geräteknoten mit derselben Bedeutung). Fügen Sie beispielsweise Folgendes oben in das Skript ein:

if [ -e "$1" ]; then
    filename=$1
else
    filename=/dev/stdout
fi

Und leiten Sie dann die Ausgabe jedes Befehls um an$filename

Antwort3

Wenn nur Dateiparameter benötigt werden, funktioniert auch Folgendes:

command_with_output > ${1:-/dev/stdout}

Bearbeiten: Oder noch besser, da Sie sich wahrscheinlich auch für Fehler interessieren:

command_with_output &> ${1:-/dev/stdout}

verwandte Informationen