Quais são os atalhos de teclado para a linha de comando?

10

Eu estou falando sobre os atalhos de teclado que você usa na linha de comando / terminal.

Exemplo: Ctrl+ cque encerra o processo, Ctrl+ dque efetua logout, Ctrl+ zque envia o processo para segundo plano ... etc.

Eu testei alguns e descobriu que eles não são nem terminal (ou seja gnome-terminal, xterm, konsole) específica nem shell (ou seja bash, zsh) específico, eles ainda trabalho em ttys.

Então, eu quero saber:

  • Quem fornece esses atalhos?
  • Como posso listar e modificar / defini-los?
Pandya
fonte
Tente bind -plistar, assim como help bindpara outros
Costas

Respostas:

10

O driver de terminal do kernel ( termios) interpreta as chaves especiais que podem ser digitadas para enviar um sinal para um processo, enviar final de arquivo, apagar caracteres etc. Esta é a funcionalidade básica do kernel Unix e muito semelhante na maioria das implementações Unix e Linux.

O sttycomando exibe ou define os termioscaracteres especiais, além de outros parâmetros para o driver da linha de terminal.

Invoque stty -apara ver os valores atuais dos caracteres especiais e outras "configurações da linha de terminal". Nos exemplos a seguir, você pode ver que intré Ctrl+ C, eofé Ctrl+ D, suspé Ctrl+ Z. (Excluí outra saída para mostrar apenas as configurações de caracteres especiais):

stty -a caracteres especiais no GNU / Linux:

intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;

stty -a caracteres especiais no FreeBSD:

cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = ^@; eol2 = ^@;
        erase = ^?; erase2 = ^H; intr = ^C; kill = ^U; lnext = ^V;
        min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
        stop = ^S; susp = ^Z; time = 0; werase = ^W;

Para alterar o valor de um caractere especial, por exemplo, para alterar o caractere de interrupção de Ctrl+ Cpara Ctrl+, Einvoque sttyassim ( ^Esão literalmente dois caracteres, o circumflex ( ^) seguido pela letra E):

stty intr '^E'

Para mais informações, consulte as páginas de manual de sttye termios. No GNU / Linux, você também pode olhar na tty_ioctlpágina do manual.

Notas:

A intrchave ( Ctrl+ Cpor padrão), na verdade, não elimina o processo, mas faz com que o kernel envie um sinal de interrupção ( SIGINT) para todos os processos dentro do grupo de processos. Os processos podem organizar para capturar ou ignorar o sinal, mas a maioria dos processos será encerrada, que é o comportamento padrão.

A razão que Ctrl+ dregistra-lo para fora é porque o controlador de linha terminal envia EOF (fim de arquivo) na entrada padrão do shell. O shell sai quando recebe o final do arquivo em sua entrada padrão.

RobertL
fonte
@Sukminder, no FreeBSD, a -aopção POSIX foi adicionada stty.
precisa saber é o seguinte
Eu tentei stty intr '^E'isso funciona (conjuntos), mas temporariamente e por apenas tty / terminal atual. Como faço para alterá-lo globalmente e permanentemente?
Pandya
Eu acho que a melhor maneira seria chamar sttyseu $ HOME / .profile ou $ HOME / .bashrc ou algum outro arquivo de inicialização de inicialização do shell.
precisa saber é o seguinte
Eu tentei: ele funciona com terminal, mas sem efeito em #tty
Pandya
O que você tentou, o que vê e o que você quer dizer com tty? Talvez isso possa ser uma nova pergunta?
precisa saber é o seguinte
14

De http://www.skorks.com/2009/09/bash-shortcuts-for-maximum-productivity/

Atalhos de edição de comandos

  • Ctrl+ a- vá para o início da linha de comando
  • Ctrl+ e- vá para o final da linha de comando
  • Ctrl+ k- excluir do cursor até o final da linha de comando
  • Ctrl+ u- excluir do cursor para o início da linha de comando
  • Ctrl+ w- excluir do cursor para o início da palavra (ou seja, excluir uma palavra para trás)
  • Ctrl+ y- colar palavra ou texto que foi cortado usando um dos atalhos de exclusão (como o acima) após o cursor
  • Ctrl+ xx- move entre o início da linha de comando e a posição atual do cursor (e vice-versa)
  • Alt+ b- recua uma palavra (ou vá para o início da palavra em que o cursor está ativado)
  • Alt+ f- avançar uma palavra (ou ir para o final da palavra em que o cursor está ativado)
  • Alt+ d- excluir para o final da palavra começando no cursor (palavra inteira se o cursor estiver no início da palavra)
  • Alt+ c- coloque em maiúscula no final da palavra começando no cursor (palavra inteira se o cursor estiver no início da palavra)
  • Alt+ u- faz maiúsculas do cursor até o final da palavra
  • Alt+ l- faz minúsculas do cursor até o final da palavra
  • Alt+ t- troca a palavra atual pela anterior
  • Ctrl+ f- avançar um caractere
  • Ctrl+ b- retrocede um caractere
  • Ctrl+ d- excluir caractere sob o cursor
  • Ctrl+ h- excluir caractere antes do cursor
  • Ctrl+ t- troca o caractere sob o cursor pelo anterior

Atalhos de Recuperação de Comando

  • Ctrl+ r- pesquisa o histórico para trás
  • Ctrl+ g- escapar do modo de pesquisa de histórico
  • Ctrl+ p- comando anterior no histórico (ou seja, retornar ao histórico de comandos)
  • Ctrl+ n- próximo comando no histórico (ou seja, avançar no histórico de comandos)
  • Alt+ .- use a última palavra do comando anterior

Atalhos de controle de comando

  • Ctrl+ l- limpa a tela
  • Ctrl+ s- interrompe a saída na tela (para comando detalhado de longa duração)
  • Ctrl+ q- permite saída para a tela (se anteriormente interrompida usando o comando acima)
  • Ctrl+ c- finaliza o comando
  • Ctrl+ z- suspender / parar o comando

Comandos do Bash Bang (!)

O Bash também possui alguns recursos úteis que usam o! (bang) para permitir que você faça coisas descoladas com os comandos do bash .

  • !! - executa o último comando
  • ! blah - execute o comando mais recente que começa com 'blah' (por exemplo! ls)
  • ! blah: p - imprima o comando que o ! blah executaria (também o adiciona como o último comando no histórico de comandos)
  • ! $ - a última palavra do comando anterior (o mesmo que Alt +. )
  • ! $: p - imprima a palavra que ! $ substituirá
  • ! * - o comando anterior, exceto a última palavra (por exemplo, se você digitar ' find some_file.txt / ', então ! * Daria a você ' find some_file.txt ')
  • ! *: p - imprima o que ! * substituiria
Jesus Cepeda
fonte
1
@Sukminder Não, Ctrl + S interrompe a saída. Você parece estar confundindo com Ctrl + Z.
Gilles 'SO- stop be evil'
Veja também: Emacs.
Erich
Agradável! E existe uma maneira de alcançar o ^Uque stty -aé definido para o SIGKILL no Linux, a partir do bash? De preferência, sem definir o material da linha de leitura (talvez através de uma terceira chave mod / meta). Suponho que é apenas sombreado pela ligação ctrl + u readline?
Nyov 28/08/19