Se eu fizer
$ cat > file.txt
texto Ctrl- DCtrl-D
Pergunta 1: Se eu não pressione enter, por que eu tenho que pressionar Ctrl- Dduas vezes?
Se eu fizer
$ 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
Por que é a segunda vez que o arquivo tem 1 linha?
command-line
terminal
cat
névoa
fonte
fonte
cat
a interrupção?Respostas:
No Unix, a maioria dos objetos que você pode ler e escrever - arquivos comuns, tubulações, terminais, unidades de disco bruto - são todos criados para se parecer com arquivos.
Um programa como
cat
lê sua entrada padrão como esta:que pede 512 bytes.
n
é o número de bytes realmente lidos ou -1 se houver um erro.Se você fizesse isso repetidamente com um arquivo comum, obteria um monte de leituras de 512 bytes, uma leitura um pouco mais curta no final do arquivo e, em seguida, 0 se você tentasse ler além do final do arquivo. Portanto,
cat
será executado até quen
seja <= 0.Ler de um terminal é um pouco diferente. Depois que você digita uma linha, finalizada pela Enterchave,
read
retorna apenas essa linha.Existem alguns caracteres especiais que você pode digitar. Um é Ctrl-D. Quando você digita isso, o sistema operacional envia toda a linha atual que você digitou (mas não a Ctrl-Dprópria) para o programa que está fazendo a leitura. E aqui está o acaso: se Ctrl-Dé o primeiro caractere da linha, o programa recebe uma linha de comprimento 0 - exatamente como o programa veria se chegasse ao final de um arquivo comum.
cat
não precisa fazer nada diferente , seja lendo um arquivo comum ou um terminal.Outro personagem especial é Ctrl-Z. Quando você digita, em qualquer lugar da linha, o sistema operacional descarta o que você digitou até esse ponto e envia um sinal SIGTSTP ao programa, que normalmente o interrompe (pausa) e retorna o controle ao shell.
Então no seu exemplo
você digitou alguns caracteres que foram descartados e
cat
foi interrompido sem ter gravado nada no arquivo de saída.você digitou uma linha, que
cat
leu e gravou em seu arquivo de saída e depois Ctrl-Zparoucat
.fonte
cat
, um programa que lesse dados do teclado e não parasse na primeira vezread
produzisse um zero poderia continuar, e o número de D's de controle necessários seria determinado por o número de zeros consecutivos que o programa exigiu para decidir que foi feito?ex
editor, se você digitar um controle-D como o primeiro caractere de uma linha, o editor mostrará algumas linhas do programa em vez de sair. (Emex
evi
, Control-D é um mnemônico para "inativo"). E com muitos shells, se você digitar Control-D, mas tiver trabalhos em execução em segundo plano, o shell o informará disso em vez de sair, mas se você digitar Control-D novamente, o shell decidirá que você realmente deseja sair de qualquer maneira e fará isso.Isso porque Ctrl+ Dé um hack.
No fundo, Ctrl+ D(apesar de ser chamado de
eof
caractere ) não significa realmente final de arquivo: significa "enviar a entrada pendente para o aplicativo agora". Na verdade, é quase o significado de Ctrl+ M(eol
), que envia a entrada pendente mais uma nova linha.Quando você pressiona Ctrl+ Dimediatamente após um Ctrl+ M(ou seja, no início de uma linha) ou após outro Ctrl+ D, a entrada pendente fica vazia. Assim, o aplicativo recebe 0 bytes de entrada. Em uma
read
chamada, a leitura de 0 bytes sinaliza o final do arquivo.Quando você pressiona Ctrl+ Z, a entrada pendente é descartada. Portanto, apenas o que já havia sido enviado ao aplicativo (que é
cat
) inserindo uma nova linha ou Ctrl+ Dantes de pressionar Ctrl+ Zé processado.fonte