Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
ROZDZIAŁ1.KONSOLAIINTERPRETERPOLECEŃ
Podsumowując,wmomenciefaktycznegouruchomieniaprogramu(przekierowa-
niaodbywająsiębezpośrednioprzedjegouruchomieniem),stdoutnowegoprocesu
(deskryptor1)jestprzekierowanedoplikuxyz,astderr(deskryptor2)wskazujena
stdoutprocesurodzica(interpretera).Nicnatomiastniezmieniłosięwprzypadku
stdin(deskryptor0).
Rozważmyjeszczejedenprzypadek.Załóżmy,żechcemyzamienićstdoutistderr
miejscami,takabystdouturuchamianegoprocesuwskazywałonastderrinterpretera,
orazanalogicznie,abystderruruchamianegoprocesuwskazywałonastdoutinterpre-
tera.Wtymcelunależystworzyćdodatkowytymczasowydeskryptor(podobniejak
przyzamianiemiejscamiwartościzmiennych)izniegoskorzystać.
Polecenie,któregoużyjemy,wyglądanastępująco:program3>&11>&22>&3.
Rozważmy,cosiędziejewkolejnychkrokachprzekierowań:
1.3>&1(awięcfd3=fd1)mazostaćutworzonynowydeskryptor3(fd3),
którymawskazywaćnatosamo,codeskryptor1,czylinaodziedziczonepo
interpreterzestdout.
2.1>&2(awięcfd1=fd2)odterazdeskryptor1mawskazywaćnatosamo,
codeskryptor2,czylinaodziedziczonepointerpreterzestderr.
3.2>&3(awięcfd2=fd3)odterazdeskryptor2mawskazywaćnatosamo,
codeskryptor3,czylinaodziedziczonypointerpreterzestdout.
Ostateczniewmomencieuruchomieniaprogramustdoutnowegoprocesu
będziewskazywaćnastderrprocesuinterpretera,astderrnowegoprocesunastdout
interpretera.
Abyprzetestowaćopisanymechanizmwpraktyce,wartostworzyćpomocniczy
program,np.wjęzykuPython(2.7):
importsys
print>>sys.stderr,"STDERR"
print"STDOUT"
Przetestowaniepodmianybędziewymagałoodnasupewnieniasię,żestdoutistderr
interpreterawskazująnaróżneurządzenia.Możemynp.wywołaćinterpreterzprze-
kierowanymistdout/stderrdooddzielnychplikóworaznakazaćmuuruchomićpomoc-
niczyprogramzewspomnianymiprzekierowaniami:
Ubuntu:
$bash-c--"pythonp1.py3>&11>&22>&3">log-stdout2>log-stderr
$catlog-stdout
STDERR
$catlog-stderr
STDOUT
30