Acidental 'nano SomeFile | uniq 'renderiza o shell sem resposta

5

Na minha tentativa de obter entradas únicas (linhas de leitura) de um arquivo de texto simples, eu executei nano SomeTextFile | uniq acidentalmente.

Esta "instrução" renderiza o shell (bash) completamente (?) sem resposta / não utilizável - testado dentro de Yakuake e Konsole . Eu tive que recuperar o ID do processo (PID) (executando ps aux | grep nano ) e manualmente sudo kill -9 o PID em questão.

De qualquer forma, não poderia (ou não deveria?) o texto acima retornar alguma mensagem de erro? Por que o Ctrl + C não mata este pipeline? Existe uma maneira mais fácil ou mais limpa de pará-lo do que kill -9 ?

    
por Nikos Alexandris 20.12.2012 / 06:10

4 respostas

3

Como outras respostas já explicaram, Ctrl + C não mata o Nano porque a entrada de nano ainda está vindo do terminal, e o terminal está ainda o terminal de controle de nano , então Nano está colocando o terminal no modo raw onde os caracteres de controle como Ctrl + C são transmitidos para o programa e não são interceptados pelo terminal para gerar sinais.

Quando interceptado pelo terminal, Ctrl + C gera um sinal SIGINT . Se você conhece o ID de processo de nano (você pode descobrir com ps u -C nano (Linux ps syntax) ou pgrep nano ou outro utilitário de listagem de processos), você pode enviar este sinal com kill -INT 12345 onde 12345 é o PID. No entanto, SIGINT convencionalmente significa “retornar ao loop principal”, e o Nano não sai quando recebe o SIGINT. Em vez disso, envie SIGTERM , que significa "finalizar normalmente"; este é o sinal padrão, então você pode apenas executar kill 12345 . Outra possibilidade é kill -HUP 12345 ; SIGHUP significa "você não tem mais um terminal, saia com graça, a menos que você possa viver sem". Se tudo mais falhar, envie SIGKILL ( kill -KILL 12345 , ou famosa kill -9 12345 ), que mata o programa se quer morrer ou não.

Muitos programas, incluindo o Nano, reconhecem Ctrl + Z para suspender. Esta é a mesma sequência que envia o sinal SIGTSTP . Se o programa reconhecer essa chave de controle, você recebe de volta um prompt do shell e, como o programa se torna um job em segundo plano, você pode facilmente eliminá-lo com kill %% (que envia um sinal para o último trabalho) .

Com o Nano, há um substituto way : envia a sequência de teclas de saída, ou seja, Ctrl + X seguido, se necessário, por N para “não salvar” . Mas, em geral, lembre-se disso:

  1. Tente Ctrl + Z seguido por kill %% , e se isso não matar o programa kill -9 %% .
  2. Se a Ctrl + Z não funcionou, mude para outro terminal, encontre o ID do processo (você pode usar ps -t pts/42 para listar os processos em execução no terminal /dev/pts/42 ) e mate-o.
por 21.12.2012 / 03:22
10

O símbolo pipe está enviando a saída de nano para a entrada do comando uniq .

No entanto, nano ainda está em execução e recebendo sua entrada de teclado. É só que você não pode ver sua saída, pois uniq não irá mostrar seus resultados até ver um Fim de Arquivo (isso não é importante para a questão).

Quando você pressiona ctrl-c , ele é 'capturado' pelo nano, mas não faz com que ele saia.

A maneira de sair do nano é pressionar ctrl-x , mas nano não sairá se modificações forem feitas, por exemplo, se você tiver pressionado outras teclas desde a entrada. Neste caso, o nano perguntará o seguinte:

Save modified buffer (ANSWERING "No" WILL DESTROY CHANGES) ?                                                                
 Y Yes
 N No           ^C Cancel

Pressionar a tecla 'n' sairá sem salvar as alterações.

É possível que você acerte algumas combinações de teclas antes de perceber que estava em nano, e nesse caso você pode ter alguns menus de profundidade. Felizmente, no nano pressionando ctrl-x também sairá da maioria dos menus (mas não cancelará o prompt acima), isso significa que pressionar ctrl-x várias vezes nunca o levará mais longe da saída.

Se você estiver 'preso' em alguns menus 'deep', normalmente você pode sair pressionando pressionando ctrl-x algumas vezes, seguido pela tecla n . Se isso não funcionar, isso significa que você pressionou ctrl-x uma vez a mais - apenas pressione ctrl-x um mais tempo, seguido pela tecla n - isso sempre funcionará.

    
por 20.12.2012 / 09:21
2

O shell não recebe Ctrl+C , nano . Os programas podem definir o comportamento personalizado para sinais de interrupção e nano é um desses programas. Para ver qual o comportamento personalizado está aberto nano sem o redirecionamento e envie um Ctrl+C .

    
por 20.12.2012 / 08:14
2

Atingir Ctrl + X .

O Nano captura todas as entradas do teclado e dentro do Nano Ctrl + C tem um significado totalmente diferente do que no shell. Se você executar um nano em uma janela separada, poderá ver facilmente quais chaves devem ser inseridas para sair. Ctrl + X

    
por 20.12.2012 / 09:01