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=$1
wirklich das ist, was ich brauche, anstatt [ -e "$1" ] && outfile=$1
dass 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
exec
kann verwendet werden, um die Standardausgabe des aktuellen Skripts in eine andere Datei umzuleiten.
[ -e "$1" ] && exec > $1
command_with_output
Antwort2
$1
Eine andere Möglichkeit besteht darin , als Dateinamen zu verwenden, wenn dieser übergeben wurde, und /dev/stdout
andernfalls (was unter Linux ein symbolischer Link ist /proc/self/fd/1
und 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}