Jeśli zrobię
$ cat > file.txt
tekst Ctrl- DCtrl-D
Pytanie 1: Jeśli nie naciskam Enter, dlaczego muszę naciskać Ctrl- Ddwa razy?
Jeśli zrobię
$ cat > file.txt
pa bam pshhh Ctrl-Z
[2]+ Stopped cat > file.txt
$ cat file.txt
$ cat > file.txt
pa bam pshhh
Ctrl-Z
[2]+ Stopped cat > file.txt
$ cat file.txt
pa bam pshhh
Dlaczego po raz drugi plik ma 1 linię?
command-line
terminal
cat
zamglenie
źródło
źródło
cat
zatrzymaniu?Odpowiedzi:
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: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 nien
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
wpisałeś kilka znaków, które zostały odrzucone, a następnie
cat
został zatrzymany bez zapisania czegokolwiek w pliku wyjściowym.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
.źródło
cat
, program, który czytał dane z klawiatury i nie zatrzymywał się po raz pierwszy,read
dawał zero, mógł kontynuować, a liczba wymaganych D-Control byłaby określona przez liczba kolejnych zer zerowych wymaganych przez program do podjęcia decyzji?ex
edytorze, jeśli wpiszesz control-D jako pierwszy znak linii, edytor pokaże ci kilka linii programu zamiast wychodzenia. (Wex
ivi
Control-D to mnemonik dla „down”). W przypadku wielu powłok, jeśli wpiszesz Control-D, ale zadania działają w tle, powłoka poinformuje Cię o tym, a nie wyjdzie, ale jeśli ponownie wpiszesz Control-D, powłoka zdecyduje, że naprawdę chcesz wyjść i tak zrobię.To dlatego, że Ctrl+ Dto hack.
W głębi duszy Ctrl+ D(pomimo tego, że jest nazywany
eof
postacią ) tak naprawdę nie oznacza końca pliku: oznacza „wyślij oczekujące dane wejściowe do aplikacji teraz”. Jest to w rzeczywistości bliskie znaczeniu Ctrl+ M(eol
), który wysyła oczekujące dane wejściowe plus nowy wiersz.Gdy naciśniesz Ctrl+ Dnatychmiast po znaku Ctrl+ M(tj. Na początku wiersza) lub po innym znaku Ctrl+ D, oczekiwane dane wejściowe są puste. W ten sposób aplikacja otrzymuje 0 bajtów danych wejściowych. W
read
wywołaniu odczyt 0 bajtów sygnalizuje koniec pliku.Po naciśnięciu Ctrl+ Zoczekujące dane wejściowe są odrzucane. W ten sposób przetwarzane jest tylko to, co zostało już przesłane do aplikacji (czyli jest
cat
) przez wprowadzenie nowej linii lub Ctrl+ Dprzed naciśnięciem Ctrl+ Z.źródło