/ / BASH - Przechowywanie referencji stdin '& 0' w zmiennej - bash, przekierowanie, stdin

BASH - Przechowywanie odniesienia stdin 'i 0' w zmiennej - bash, przekierowanie, stdin

Próbując odczytać z pliku LUB stdin, chcę zrobić coś takiego:

if [ "$1" == "-" ]
then
INPUTFILE="&0"
fi

Ale jeśli tak zrobię

while read ROW
do
# ... something
done <$INPUTFILE

mam

&0: No such file or directory

Z poziomu wiersza poleceń

cat <&0

działa idealnie, czy istnieje sposób na przechowywanie referencji standardowej w zmiennej?
PS: Wiem, że ten sam wynik można osiągnąć w prosty sposób ...

Odpowiedzi:

4 dla odpowiedzi № 1

Są okazje, kiedy cat ma swoje zastosowania, a to może być jeden z nich:

# Use cat so it works if $1 is just -
cat $1 |
while read ROW
do
...whatever
done

Dokumentuj, dlaczego używasz cat lubię to; w przeciwnym razie wygląda jak UUOC (Bezużyteczne użycie kota).


2 dla odpowiedzi nr 2

To nie działa, ponieważ powłoka interpretuje &0 jako nazwa pliku.

Zamiast mówić:

INPUTFILE="&0"

mówić:

INPUTFILE="/proc/$$/fd/0"

To sprawi, że będzie czytać z STDIN bieżącego procesu powłoki.


0 dla odpowiedzi № 3

&0 nie jest nazwą pliku, ale jest częścią zapisu przekierowań we / wy przy użyciu deskryptorów plików: należy przeczytać <&0 jako całość.

Możesz znaleźć więcej szczegółów w ten dokument.