Por que Ctrl + V não cola no Bash (shell Linux)?


192

Quando copio algo na área de transferência e pressiono Ctrl+ Vno Bash, nada acontece; No entanto, clicar com o botão direito do mouse e selecionar Colar faz o trabalho.

Por quê? Existe algum problema razoável (tenho certeza que existe) por trás desse comportamento no Linux?


25
Shift- Inserttambém funciona
bonyiii

33
Eu prefiro Ctrl-Shift-Vpessoalmente.
Amalloy # 7/12

3
Você também pode usar Shift + Insert na maioria dos ambientes de shell.
Fabian

4
E se você não tiver uma chave Inserir?
Ben Racicot

3
ele não funciona no prompt de comando do Windows' demasiado
phuclv

Respostas:


360

Nos dias de terminais físicos , não existiam pranchetas para toda a sessão, apenas alguns programas suportavam copiar / colar interno - geralmente sob o nome de "buffers" ou "kill rings" - e usavam várias teclas diferentes. Por exemplo, o shell bash usa CtrlKou CtrlUpara "matar" (cortar), CtrlY"puxar" (colar); isso vem do emacs editor .

CtrlCEm quase todos os lugares do Unix havia a tecla "interrupção" , usada para cancelar o programa ou operação atual. A CtrlVchave geralmente significava "inserção literal" - ou seja, insira o seguinte caractere literalmente sem executar nenhuma ação associada. Por exemplo, um normal Escmuda para o modo no comando vi editor, mas CtrlV, Escirá inserir o ESCcaractere no documento.

O uso de CtrlCcopiar e CtrlVcolar da área de transferência para toda a sessão foi introduzido pelo Mac OS em 1983 e pelo Microsoft Windows 3.x em 1990. (Versões anteriores do Windows (1.xe 2.x), bem como pelo IBM OS / 2 , suportou apenas as teclas IBM CUACtrlIns para copiar e ShiftInscolar; esses atalhos permanecem suportados por todas as versões do Windows.)

Quando as GUIs com suporte à área de transferência finalmente chegaram ao Unix, as Ctrlteclas já estavam em uso por muitos programas de terminal. Além disso, a interface gráfica X possuía mecanismos um tanto diferentes : "seleções" e "buffers de corte". Mesmo agora, você pode selecionar o texto em um programa e inseri-lo usando o botão do meio do mouse, sem nenhuma ação explícita de cópia.

Em suma, no momento em que o Xterm e o GNOME Terminal foram escritos (acho que você usa o último), CtrlV já tinham um significado completamente diferente por muitos anos e não podiam ser alterados. Além disso, um método alternativo de copiar texto - a "seleção" - já estava presente no X11, portanto, a ação explícita de copiar / colar provavelmente não era tão importante quanto seria no Windows. Isso significa que diferentes atalhos de teclado tiveram que ser selecionados - por exemplo, os programas de terminal mais modernos, como o GNOME Terminal, usam CtrlShiftCe CtrlShiftV. (Se você usar o Xterm, os mesmos atalhos podem ser adicionados manualmente usando o Xresm * vt100 * traduções Xresource. O Rxvt não possui essa opção.)

(A maioria dos kits de ferramentas X11 também suporta as teclas "copiar" e "colar" do CUA, que não entram em conflito com os programas do terminal. Infelizmente, as implementações são bastante inconsistentes - CtrlInscópias para a "área de transferência" na maioria dos programas (GTK, Qt4, mas ignoradas por Xaw); no entanto, ShiftInscola da "seleção primária" na maioria dos programas GTK e Qt4, mas da "área de transferência" no Firefox e dos buffers de corte agora obsoletos no Xaw agora obsoleto).


Tudo o que disse, alguns terminais ou consolas (em particular, o console do Windows 10) fazer apoiar essas chaves. Como o console do Windows sempre teve um modo "marcar / selecionar" separado, CtrlCagora também tem dois significados baseados no contexto - no modo regular ele envia uma interrupção, no modo de seleção copia para a área de transferência (como Entercostumava ser).

Enquanto isso, as ferramentas de linha de comando do Windows nunca eram realmente usadas CtrlV para nada, portanto era obrigatório "colar" sem incomodar muito. Fazer o mesmo em terminais tipo Unix, no entanto, seria mais problemático.


10
Hmm. No Vim, "puxar" significa copiar em vez de colar. Isso parece fazer mais sentido também. Você tem certeza do significado desse termo aqui?
Konrad Rudolph

11
Sim eu tenho certeza. O Bash herda os atalhos padrão dos seus equivalentes no Emacs .
grawity

4
@ grrawity: seu último comentário é um pouco teenie equivocado. O Bash oferece dois modos de edição por linha de comando, modo vim e modo emacs. Acontece que o modo emacs é o padrão na maioria das instalações. Isso aumenta a ambiguidade no uso do termo yank , mesmo para bash.
Rahmu

1
A-ha! Eu sabia que os desenvolvedores do Vimperator cometeram um erro quando mudaram <C-v>para a iversão 3, mas não sabia exatamente por quê .
Izkata

2
@ Colin: Você ainda perdeu a distinção entre a área de transferência e a seleção X. Existem várias seleções (PRIMARY, SECONDARY, CLIPBOARD), mas apenas uma delas é chamada de "área de transferência" - a seleção CLIPBOARD, porque é para onde o Ctrl-C copia e é para onde o Ctrl-V cola. A seleção principal não é a área de transferência.
grawity

47

Use CtrlShiftVpara colar.

Ctrl com outros caracteres geralmente é usado pelo shell para funções especiais.


4
Então, por que o Linux não registra CTRL + SHIFT para funções especiais? Eu acho que copiar e colar é mais típico para alguns usuários do que funções especiais, certo?
Yasser Zamani

22
Os shells existiam muito antes de existirem terminais gráficos e GUIs com funcionalidade de recortar e colar, portanto, seu argumento não é realmente válido. @YasserZamani
slhck

9
Ctrl + Shift + V é executado pelo emulador de terminal (supondo que você esteja usando o Terminal GNOME) e não por bashsi só. Se você estiver fora de um ambiente da GUI ou se estiver usando outro termo emulador, isso provavelmente não funcionará. Não pense que este comando é portátil.
Rahmu

@rahmu Oh, não fazia ideia disso. Use apenas as instalações de estoque do Ubuntu. Existe um comando universal?
Akash

2
Provavelmente não existe um para acessar a área de transferência (apenas Shift + Ins para a seleção principal). Até a própria área de transferência é uma coisa X11, não acessível a partir de tty's. No entanto, Ctrl + Shift + V é suportado pelo Terminal GNOME, Xfce4 Terminal, KDE Konsole; isso abrange os ambientes GUI mais populares.
grawity

20

Aqui estão as configurações de colar e copiar de uso geral com terminais populares:

gnome-terminal (mais popular no Linux)
Copiar : CtrlShiftC
Colar : CtrlShiftV
Nota : Selecionar para copiar e middle-clickcolar também funciona, mas usa uma área de transferência alternativa.

PuTTY (terminal mais popular no Windows)
Copie : (selecione com o mouse, nenhuma interação do teclado)
Colar : Right-click (ou de forma mais confiável: shiftRight-click)
Nota : Aplicativos que levam a entrada do mouse (como vime links) pode roubar Right-click- shiftRight-clickserá sempre trabalhar em qualquer aplicativo.


Cópia de terminal do OSX : AppleC
Colar : AppleV
Nota: os aplicativos que assumem o controle do mouse (como vime links) podem substituir o que significa selecionar texto; nesse caso, a cópia não funcionará da maneira que você espera. Nesses casos, mantenha pressionado Controlenquanto arrasta o mouse para selecionar. A interação do mouse com os aplicativos é desativada por padrão nas configurações do terminal, para que a maioria das pessoas nem saiba disso.


Não é cmd.exemais popular que o PuTTY no Windows? :-)
Ben

@ Ben Não como um terminal SSH.
tylerl

1
Não, cmd.exenão é um terminal SSH. Isso é muito verdade.
Ben

3
@ Ben: Não é um terminal em tudo - apenas uma concha. O terminal padrão no Windows é o componente "Windows Console" do csrss.
grawity

@Ben, mas clicar com o botão direito do mouse para colar também funciona cmd.exe(e é o único caminho, se você não quiser abrir o menu> editar> colar) no modo de edição rápida . Não há nenhum atalho no prompt de comando pré-win10
phuclv

17

É uma tradição profundamente enraizada que a Ctrlchave junto com uma letra gere caracteres de controle ASCII encontrados subtraindo 64 do valor ASCII da letra maiúscula. Esse cálculo é mapeado Ctrl- Apara 1 e assim por diante. Por exemplo Ctrl- Ié Tabe Ctrl- Jé avanço de linha.

Não existe uma tradição semelhante para Ctrl- Shift. Ctrl- Shift- Vnão se espera que produza qualquer caractere específico.

Os emuladores de terminal devem suportar a tradição, passando de maneira transparente pela Ctrlconvenção, permitindo que ela apareça como entrada de caractere para os programas que estão sendo operados através dessa janela do terminal. Programas baseados em terminal mapeiam chaves de controle para comandos. Por exemplo, o Bash usa Ctrl- Vcomo um comando que significa "interpretar o próximo caractere literalmente". Isso permite incorporar um caractere de controle na linha de comando. Se o terminal roubar chaves de controle para uso próprio, esses comandos se tornam indisponíveis. Portanto, interceptar Ctrl- Vpara uma meta-função está fora de questão (pelo menos em uma configuração padrão).

Entretanto, os emuladores de terminal são livres para interceptar Ctrl- Shift- o Vque não é esperado que gere um caractere. Ctrl- Shift- Vnão é um padrão; é uma coisa do terminal Gnome (que pode estar em outros terminais).

Nos desktops Unix baseados em X, a convenção é que nenhum comando é necessário para copiar. Você acabou de selecionar o texto. E o botão do meio cola esse texto em outro lugar. Você verá que ele funciona no Xterm, no Gnome Terminal e no Firefox.

Ctrl- Vé uma convenção do Microsoft Windows, que é uma imitação de Apple- Vdo Macintosh.


3
Não é exatamente subtração - tradicionalmente o Ctrl limpou o sexto e o sétimo bits do personagem; por isso, Ctrl + Shift + letter funciona de forma idêntica a Ctrl + Letter na maioria dos terminais (a menos que seja explicitamente substituído pelo terminal, como no caso de atalhos de copiar / colar).
grawity

1
Como as chaves são essencialmente ordenadas aleatoriamente em relação ao padrão ASCII, a ROM do programa inclui várias tabelas de consulta que auxiliam na geração dos códigos ASCII. ... Manter pressionada a tecla CONTROL quando outra tecla é pressionada causa outra consulta à tabela. [Manual técnico da série VT100, 4.4.9.3, Digital].
Kaz

1
@Linger obrigado pela edição. É renderizado bem, mas não há como digitar todas essas <kbd>tags em postagens futuras.
Kaz

Ctrl-Aé 1. Como posso tentar isso? Meu terminal Gnome não faz nada quando pressiono Ctrl-A.
Robert3 de

3

Para mim, a maneira mais simples de copiar e colar no shell é:

Selecione o código desejado e cole-o clicando no mouse-middle-key


1
Contanto que você tenha uma tecla do meio do mouse.
precisa saber é

1
@ jpierson não que eu esteja recomendando isso fortemente, mas você pode escrever um pequeno script que simplesmente usa xdotool click 2para emular o clique do terceiro botão. Então, em qualquer ambiente de gerenciador de janelas / área de trabalho em que você esteja, você poderá vincular esse script a uma chave - digamos mod i(para inserção) ou a qualquer combinação de teclas que você possa ter disponível (ou qualquer modificação que possa significar - o que realmente depende de onde você deve vincular isso)
dylnmc

2

Podemos usar o botão Inserir teclado para copiar e colar (nos teclados antigos, pode estar faltando)

Copiar : CtrlInsert
Colar :CtrlShiftInsert


1

você também pode usar o botão do meio de um mouse se estiver com preguiça e selecionar um comando em um documento de texto, script ou web ou fórum. Depois de selecionar o comando pretendido, simplesmente vá para o seu terminal e clique no botão do meio do mouse. Eu uso esse método como eu uso o linux de filhote, que parece não suportar o comportamento normal de clicar e colar com o botão direito. isso acontece em uma janela de tratamento de arquivos, mas não em uma janela de terminal. não sei por que, mas estou quieto satisfeito por ter descoberto o método do botão do meio, muito útil! ;-)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.