Witamy w kolejny piątek ...
Czas poznać maleńką część terminala. Po długim namyśle postanowiłem stworzyć wpis o standardowe strumienie; Chociaż będzie to powierzchowne, myślę, że każdy powinien o tym wiedzieć.
Strumień standardowy
Strumień standardowy Składa się z kilku kanałów komunikacji między użytkownikiem a terminalem. Te „kanały” wejścia / wyjścia wyświetlają lub przechwytują informacje, gdy polecenie jest wykonywane.
Trzy połączenia we / wy to: stdin Standardowe wejście, stdout Wyjście standardowe, stderr Standardowy błąd.
stdin: standardowe wejście
Standardowe dane wejściowe to sposób, w jaki przechwytujemy informacje z polecenia za pomocą potoków, przekierowania, klawiatury itp. Identyfikujemy go za pomocą deskryptora pliku 0.
Przykładem stdin byłoby:
sort <lista
Pobiera wszystkie informacje, które są na liście - w tym przypadku liczby zapisane losowo - i podczas przekierowywania pliku do polecenia ls sortuje listę numeryczną alfabetycznie. W tym przykładzie flagi są niejawne.
stdout: standardowe wyjście
Standardowe wyjście, jak sama nazwa wskazuje, wyświetla wyjście polecenia za pośrednictwem konsoli. Jeśli napiszemy ls, wszystkie informacje, które pokazuje nam na ekranie, są standardowym wyjściem. Jest reprezentowany przez deskryptor 1.
Teraz spróbuję utworzyć instancję stdin i stdout za pomocą skryptu napisanego w bashu, po prostu dlatego, że uwielbiam bash hahaha. 🙂
test.sz
#! / bin / bash if [-t 0]; następnie echo "Używasz stdout" elif [-t 1]; następnie echo "Używasz stdin" else echo "Brutalny błąd" fi
Teraz zrzut ekranu, który pokazuje, jak używać skryptu. Podczas przekierowywania lub używania potoku ze skryptem użyj test -t wiedzieć, czy wykonywany jest tylko skrypt stdout, a jeśli nie, to oczywiście jest to standardowe wejście.
bash test.sh ls | bash test.sh bash test.sh </ etc / passwd
Pamiętaj, aby zmodyfikować polecenie i ćwiczyć, aby się uczyć.
stderr: błąd standardowy
Błąd standardowy to sposób, w jaki programy wyświetlają błędy lub diagnostykę. Jest reprezentowany przez deskryptor 2.
Aby zrozumieć tę koncepcję, oto sytuacja: kiedy chcemy zapisać błąd polecenia, pierwszą rzeczą, o której myślimy, jest przekierowanie wyjścia do zwykłego tekstu.
ls> info.txt
To zadziała, informacje o poleceniu będą przechowywane w zwykłym pliku tekstowym. Ale zapisując błąd, nie przechowuje go, ale pokazuje go na ekranie, a zwykły plik tekstowy jest pusty.
Zamiast tego, jeśli użyjemy 2>, aby wskazać, że należy zapisać stderr w pliku:
ls foo 2> info.txt
Teraz zapisze informacje o błędzie w pliku tekstowym.
Najbardziej Powłoka zezwalaj na przechowywanie stderr i stdout w jednym poleceniu polecenia z &>, gdzie Foo jest nieistniejącym katalogiem
ls Pobieranie Foo &> info.txt
Ten plik będzie zawierał informacje o błędzie podczas wykonywania ls w Foo i wyświetli listę katalogów w sekcji Pobrane.
I wreszcie, co czyni to sławnym 2> & 1?
Proste, przekierowuj stderr na stdout. To & w środku> i 1 oznacza, że przekieruje na standardowe wyjście. Gdyby go tam nie było, byłoby to coś w rodzaju… „przekieruj błąd do pliku 1”.
A dzięki temu można przekierować:
- stdout do pliku
- stderr do pliku
- stdout na stderr
- stderr na stdout
- stderr i stdout do pliku
- między innymi
To tyle dla dzisiejszych ludzi. Czytamy i dziękujemy za zatrzymanie się. 😀
Ciekawy. Dzięki twoim tutorialom znacznie bardziej podoba mi się Bash.
Drogi, ciekawe, ale masz błąd w następującym wierszu:
„A podczas przekierowywania pliku do polecenia ls” powinno być „i podczas przekierowywania pliku do polecenia sort”.
Pozdrowienia.
Na początku tekstu jest błąd, gdy wskażesz polecenie „ls”, powinno to być „sort”:
„Weź wszystkie informacje z listy - w tym przypadku liczby zapisane losowo - i przekieruj plik do polecenia ls (tutaj będzie to sortowanie)”
Pozdrawiam i dziękuję za udostępnienie swojej pracy
Jest to świetne rozwiązanie dla crona, w którym chcesz, aby dane wyjściowe były opróżniane (/ dev / null), ale błędy były przechowywane w plikach. Ponadto, kiedy to robię, zwykle używam polecenia date, aby dokładnie określić, kiedy się nie udało.
Bash (sh) ma te narzędzia, tak rozwinięte przez filozofię Uniksa "rób jedną rzecz i rób to dobrze"
Cóż, niczego się nie dowiedziałem
Haha, cóż, to całkiem dobrze wyjaśnione, czego nie zrozumiałeś?