W Uniksie większość obiektów, które można odczytywać i zapisywać - zwykłe pliki, potoki, terminale, napędy dyskowe - wszystko to przypomina pliki.
Program taki cat
czyta ze swojego standardowego wejścia, takiego jak ten:
n = read(0, buffer, 512);
który prosi o 512 bajtów. n
jest liczbą faktycznie odczytanych bajtów lub -1, jeśli wystąpił błąd.
Jeśli robiłeś to wielokrotnie ze zwykłym plikiem, dostaniesz wiązkę 512-bajtowych odczytów, a następnie nieco krótszy odczyt na końcu pliku, a następnie 0, jeśli spróbujesz odczytać poza końcem pliku. Więc cat
będzie działał, dopóki nie n
będzie <= 0.
Odczyt z terminala jest nieco inny. Po wpisaniu wiersza zakończonego Enterklawiszem read
zwraca tylko ten wiersz.
Możesz wpisać kilka znaków specjalnych. Jednym jest Ctrl-D. Po wpisaniu tego system operacyjny wysyła cały bieżący wiersz, który wpisałeś (ale nie Ctrl-Dsam) do programu wykonującego odczyt. A oto przypadkowa rzecz: jeśli Ctrl-Djest to pierwszy znak w linii, program wysyła linię o długości 0 - tak jak program zobaczyłby, gdyby dotarł do końca zwykłego pliku. cat
nie musi robić nic innego , niezależnie od tego, czy odczytuje ze zwykłego pliku czy terminala.
Inną postacią specjalną jest Ctrl-Z. Po wpisaniu w dowolnym miejscu linii system operacyjny odrzuca wszystko, co napisałeś do tego momentu, i wysyła sygnał SIGTSTP do programu, który normalnie zatrzymuje go (zatrzymuje) i zwraca kontrolę do powłoki.
Więc w twoim przykładzie
$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+ Stopped cat > file.txt
wpisałeś kilka znaków, które zostały odrzucone, a następnie cat
został zatrzymany bez zapisania czegokolwiek w pliku wyjściowym.
$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+ Stopped cat > file.txt
wpisałeś jedną linię, która cat
czytała i zapisywała swój plik wyjściowy, a następnie Ctrl-Zzatrzymała się cat
.