🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux.programowanie
2 messages
2 total messages Started by piecia aka dracorp Sun, 23 Jan 2011 22:27
bash, wykrywanie stdin
#72134
Author: piecia aka dracorp
Date: Sun, 23 Jan 2011 22:27
63 lines
2301 bytes
Witam
Rozwiązanie w sumie mam ale coś mi się nie zgadza. Dlatego prosiłbym o 
wyjaśnienie.
Głównie chciałem w skrypcie wykryć w jaki sposób są podawane dane.
#v+
#!/bin/bash
if [ -f "$1" ]; then
	FILE=$1
	echo "Czytam z pliku"
	while read LINE; do 
		echo $LINE
	done < $FILE
elif [ ! -t 0 ]; then
	echo $?
	ls -l /dev/fd/0
	echo "Czytam z stdin"
	while read LINE; do 
		echo $LINE
	done 
else
	echo "Nie podano danych"
fi
#v-
Z man test:
-t FD  file descriptor FD is opened on a terminal

Ja to rozumiem, że jeżeli deskryptor fd(w moim przypadku 0) jest otwarty 
to test zwraca 0 i można wywnioskować że dane są podawane z stdin.
Ale dlaczego musiałem użyć ! w moim teście?
Dla przykładu że to działa:
#v+
$ echo -e "ala ma kota\na kot ma ale" > plik

$ ./stdin.sh plik 
Czytam z pliku
ala ma kota
a kot ma ale

$ ./stdin.sh < plik 
0
lr-x------ 1 piecia piecia 64 01-23 23:21 /dev/fd/0 -> /home/piecia/bin/
skrypty/moje/test/plik
Czytam z stdin
ala ma kota
a kot ma ale

$ ./stdin.sh 
Nie podano danych

$ cat plik | ./stdin.sh 
0
lr-x------ 1 piecia piecia 64 01-23 23:21 /dev/fd/0 -> pipe:[173977]
Czytam z stdin
ala ma kota
a kot ma ale
#v-

Czyli domyślnie fd 0 jest ciągle otwarty a na czas wykonywania skryptu i 
przesyłania danych w potoku lub przez stdin jest zamykany? Dobrze myślę?

-- 
piecia aka dracorp
pisz na: piotr kropka rogoza at wp kropka eu
Re: bash, wykrywanie stdin
#72135
Author: Adam Osuchowski
Date: Sun, 23 Jan 2011 22:58
13 lines
1451 bytes
piecia aka dracorp wrote:
> Z man test:
> -t FD  file descriptor FD is opened on a terminal
> 
> Ja to rozumiem, że jeżeli deskryptor fd(w moim przypadku 0) jest otwarty 
> to test zwraca 0 i można wywnioskować że dane są podawane z stdin.

Pomieszałeś pojęcia. Parametr -t sprawdza, czy dany strumień jest terminalem,
a nie czy jest otwarty. Proces prawie zawsze ma standardowe wejście (czyli
strumień o deskryptorze 0), a to czy to jest regularny plik, potok (pipe)
czy terminal to jest inna kwestia. W praktyce oznacza to, że ,,[ -t 0 ]''
zwróci prawdę (0) jeśli skrypt zostanie uruchomiony z interaktywnego shella
na terminalu bez żadnych przekierowań wejścia (<).
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads