CTRL + C está incorreto para retornar à linha de comando?

27

Quando estou usando tail -fe quero retornar ao shell, sempre o uso CTRL+C. Ou, quando estou digitando um comando e sinto vontade de abortá-lo e começar de novo, simplesmente CTRL+Cvolto a um prompt de linha de comando vazio. Isso é considerado má prática? Às vezes sinto que pode haver uma maneira melhor de romper com alguma coisa, mas realmente não tenho idéia.

Restabelecer Monica
fonte
6
Para cancelar um comando shell parcialmente inserido, você pode usar Control-U ou Delete (dependendo das configurações de tty e das combinações de teclas), mas não há nada de errado em usar o Control-C.
Keith Thompson
@KeithThompson obrigado pela Ctrl + U, eu não estava ciente de que um :-)
Patrick
Para o registro, Cu realmente não cancela o comando digitado, move-o para o buffer de colagem (semelhante à funcionalidade "recortar" de alguns programas).
Chris Baixo

Respostas:

36

Ctrl+ Cenvia um SIGINT para o programa. Isso indica ao programa que você deseja interromper (e encerrar) seu processo. A maioria dos programas captura isso corretamente e sai corretamente. Portanto, sim, esta é uma maneira "correta" de terminar a maioria dos programas.

Existem outros atalhos de teclado para enviar outros sinais para programas, mas esse é o mais comum.

Chris S
fonte
9
Também há Ctrl + D para programas que estão lendo informações do usuário. Ctrl + D fecha STDIN no programa. Para sair do shell normalmente, isso também está disponível (exatamente como digitar exit).
Patrick Patrick
2
O @Patrick Ctrl + D envia um indicador de fim de arquivo ao fluxo. Cabe ao programa responder adequadamente (geralmente fechando o fluxo de arquivos).
Chris S
é isso que o fechamento do STDIN faz. Você não pode obter EOF sem o cano / fluxo sendo fechado.
Patrick
9
Errado por três razões, Patrick. Primeiro: Control + D não tem esse significado para tubos. Segundo: o caractere especial EOF não fecha nada. Isso causa um retorno único de zero bytes (presumindo que o buffer da linha esteja vazio) da read()chamada atual do sistema. Os próximos read()s não são afetados. Terceiro: nada disso se aplica a programas que colocam a disciplina de linha no modo não canônico, como a maioria dos programas shell das últimas décadas e, de fato, qualquer outro programa que utilize uma biblioteca como o GNU readline.
JdeBP
13

Este método é bom, realmente.

Sven
fonte
11

Para abortar um comando longo durante a digitação, às vezes pulo para o início da linha e insiro um sinal de comentário antes de pressionar Enter:

Home#Enter

Pos1#Return

Isso é útil, se eu digitar um comando de cópia com um caminho longo, por exemplo, e enquanto isso observar, preciso primeiro criar o diretório, mas gostaria de repetir o comando posteriormente. Então eu só tenho que retirá-lo do histórico, excluir o hash e inseri-lo.

No Bash, você pode usar o atalho

Alt+#

para comentar seu comando, como apontado nos comentários (Obrigado, @Zorawar).

Usuário desconhecido
fonte
6
Você também pode usar Ctrl-Asem tirar os dedos da linha inicial.
Dietrich Epp
11
E Ctrl-Evai até o fim, a propósito.
Dave
@ Dave: Isso mesmo, mas você não precisa ir até o final para pressionar Enter, para confirmar seu comando. A linha de comando não é um editor, onde isso pode inserir uma nova linha.
usuário desconhecido
2
No bash, você pode conseguir o mesmo pressionando Alt-#: ele colocará o comentário e executará o comando (colocando-o no seu histórico).
Zorawar
8

De um modo geral, o uso de Ctrl+ Cé bom quando o programa não oferece uma maneira interativa de finalizar (por design ou com mais frequência, porque congelou ou se tornou inutilizável). Lembre-se de que, no modo interativo, a combinação de teclas que você realmente deseja pode ser Ctrl+ D, que envia um EOFsinalizando o final da entrada.

Zorawar
fonte
1

Se estiver usando o Bash, também é possível usar Ctrl- Ze digitebg "colocar o trabalho atual em segundo plano".

Computist
fonte
0

Como o @Patrick disse no comentário sobre a resposta aceita,

Também existe Ctrl+Dpara programas que estão lendo informações do usuário.Ctrl+Dfecha STDIN para o programa.

Isso me ajudou quando Ctrl+Cnão funcionou para recuperar a linha de comando após o uso>>

enarmônico
fonte