Die Standardeingabe kann auch durch die spezielle Gerätedatei /dev/stdin
dargestellt werden , also funktioniert die Verwendung als Dateiname.
file="/dev/stdin"
./myscript < "$file"
Zunächst einmal ist stdin Dateideskriptor 0 (Null) und nicht 1 (was stdout ist).
Sie können Dateideskriptoren duplizieren oder Dateinamen bedingt wie folgt verwenden:
[[ some_condition ]] && exec 3<"$filename" || exec 3<&0
some_long_command_line <&3
Beachten Sie, dass der gezeigte Befehl den zweiten exec
ausführt wenn entweder die Bedingung falsch oder ist die erste exec
scheitert. Wenn Sie nicht möchten, dass ein potenzieller Fehler dies tut, sollten Sie einen if
verwenden / else
:
if [[ some_condition ]]
then
exec 3<"$filename"
else
exec 3<&0
fi
aber dann schlagen nachfolgende Umleitungen von Dateideskriptor 3 fehl, wenn die erste Umleitung fehlgeschlagen ist (nachdem die Bedingung wahr war).
(
if [ ...some condition here... ]; then
exec <$fileName
fi
exec ./myscript
)
Leiten Sie in einer Subshell stdin bedingt um und führen Sie das Skript aus.