AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1647887
Accepted
xpt
xpt
Asked: 2021-05-10 07:53:20 +0800 CST2021-05-10 07:53:20 +0800 CST 2021-05-10 07:53:20 +0800 CST

Lidar com NBSP no terminal

  • 772

Como lidar com NBSP em um terminal?

A seguir estão os comportamentos de eu colar exatamente a mesma string (que consiste em um NBSP principal) nos terminais:

$  echo abc
bash:  echo: command not found

$ echo abc
abc

$  echo abc
-bash: $'\240echo': command not found

$ ls ~/.inputrc
ls: cannot access '/root/.inputrc': No such file or directory

$ ls ~/.bash*
/root/.bash_history  /root/.bashrc

$ cat ~/.bashrc
. . . basically nothing there . . .

$ bind -v | grep bracketed
set enable-bracketed-paste on

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux bullseye/sid
Release:        testing
Codename:       bullseye

$ uname -rm
5.10.0-6-amd64 x86_64

O NBSP vem do documento que estou usando, seja LibreOffice Writer ou google doc etc. Então eu preciso muito fazer esse NBSP de colagem funcionar (como meu 2º caso), porque é onde eu documento meus comandos, ou seja, não consigo mudar seu comportamento.

Então,

  • Para todos os três casos, não toquei em nenhuma configuração padrão do sistema ou na minha
  • No meu segundo caso, o de trabalho, eu tenho LANG=C. Ambos os outros são baseados em utf8LANG
  • No entanto, mesmo se eu mudar para LANG=Cos outros dois, ainda estou recebendo o mesmo erro

O "método 1" desta resposta não funciona para mim:

insira a descrição da imagem aqui

e a bind '"\302\240":" "'abordagem também não está funcionando para mim (esta é uma nova máquina com apenas rootusuário no momento, então o prompt pode parecer estranho):

insira a descrição da imagem aqui insira a descrição da imagem aqui

Suponho que bind '"\302\240"esteja associando a pressionar essa tecla no terminal, enquanto estou apenas colando. Apenas supondo.

$ echo $'\240echo abc' | grep -a $'\240'`
 echo abc

nbsp=`echo $'\240'`

$ echo "${nbsp}echo abc${nbsp}${nbsp}${nbsp}def" | grep -a $'\240' 
 echo abc   def

bind "${nbsp}":" "

# then paste in the above echo output, 

$ od -c -
 echo abc   def
0000000 240   e   c   h   o       a   b   c 240 240 240   d   e   f  \n

# paste again to bash, which will become:

$ echo abcdef
abcdef

# i.e., all the spaces have been eaten, instead of mapped as " "

$ tail -5 /etc/inputrc
# map NBSP to regular space (left part has NBSP in quotes, right part has space)
"\240":" "
"\302\240":" "
" ":" "

$ tail -4 /etc/inputrc | od -c -h 
0000000   "   \   2   4   0   "   :   "       "  \n   "   \   3   0   2
0000020   \   2   4   0   "   :   "       "  \n   " 302 240   "   :   "
0000040       "  \n   " 342 220 243   "   :   "       "  \n

Todos os comandos acima são feitos em xterm, exceto o de tela preta, que é from urxvt(que dá 302 240 od -c -saída).

Conclusão:

Muito obrigado Kamil, por sua ajuda persistente. "É meia-noite onde eu moro" , disse ele, mas continuou "Vou verificar a pergunta em algumas horas" . São os comandos de ligação exatosbind 'set enable-bracketed-paste off' , e essa é a última milha que eu preciso.

bind -r '\240'

bind '"\240":" "'

bind 'set enable-bracketed-paste on'

$  echo abc   def
-bash: $'\240echo': command not found

bind 'set enable-bracketed-paste off'

$  echo abc   def
abc def

Desculpe Kamil, devo ser mais cuidadoso seguindo o que você sugeriu.

linux command-line
  • 1 1 respostas
  • 340 Views

1 respostas

  • Voted
  1. Best Answer
    Kamil Maciorowski
    2021-05-10T11:34:32+08:002021-05-10T11:34:32+08:00

    Notas preliminares

    • Esta resposta é para NBSPs codificados como \302\240(em representação octal). \302\240é para Unicode. Em iso8859-1 é único \240( \xa0, veja esta resposta ). Ajuste as soluções, se necessário.
    • Minhas soluções afetam o uso interativo que envolve o Readline. Eles não corrigem NBSPs indesejados em scripts. Se você precisar corrigir um script, use sedou qualquer outra coisa para corrigir o código no script.
    • As soluções devem funcionar para comandos digitados. Para comandos colados, eles funcionarão se enable-bracketed-pastefor off(marque bind -v | grep bracketed). A solução que substitui Enterfuncionará quando Enterfor digitada, mesmo que enable-bracketed-pasteseja one o comando tenha sido colado.

    Solução global

    A partir desta resposta no Ask Ubuntu:

    Coloque o seguinte em .inputrc[…]:

    […]

    # map NBSP to regular space (left part has NBSP in quotes, right part has space)
    " ":" "
    

    Se o markdown atrapalhar o acima

    E faz!

    Se o markdown atrapalhar o acima, você deve colocar o NBSP entre aspas no lado esquerdo dos dois pontos, conforme explicado no comentário. Isso mapeará qualquer ocorrência de NBSP no fluxo de entrada com um espaço regular.

    Readline deve entender \302\240. A versão a seguir não será quebrada por markdown, você pode copiá-la diretamente:

    "\302\240":" "
    

    Observe que esta solução pode afetar qualquer programa que use Readline e pode não haver uma maneira fácil de desabilitar a solução sob demanda para um programa. No Bash, você pode desativá-lo executando:

    bind -r '\302\240'
    

    E reative por:

    bind '"\302\240":" "'
    

    Instâncias separadas do Bash podem desabilitar a associação de forma independente.


    Apenas para Bash

    Se você deseja afetar o Bash, mas não outros programas que usam o Readline, coloque isso no seu ~/.bashrc:

    bind '"\302\240":" "'
    

    Os comandos para desativar e reativar são exatamente como na solução anterior.


    Dinamicamente

    Esta função transformará todos os NBSPs na linha de comando em espaços regulares:

    _fix_nbsp () { READLINE_LINE="${READLINE_LINE//$'\302\240'/ }"; }
    

    Vincule-o a alguma combinação não utilizada, por exemplo , Ctrl+ x, j:

    bind -x '"\C-xj": _fix_nbsp'
    

    Agora você pode limpar a linha de comando digitando Ctrl+ x, j.

    Pode ser útil fazer com que o Bash faça isso automaticamente no Enter. Normalmente Enterenvia Ctrl+ m(verifique por Ctrl+ v, Enter, você deve ver ^M), mas Ctrl+ jdeve funcionar também. Então vamos fazer Entersend Ctrl+ x, jpara acionar nossa função e depois Ctrl+ jpara executar o resultado:

    bind '"\C-m": "\C-xj\C-j"'
    

    Ctrl+ jdigitado manualmente ainda permitirá que você execute a linha de comando sem chamar a função. Lembre-se de que a função transforma todos os NBSPs em espaços regulares. Se o seu código contiver NBSPs que devem sobreviver, você precisará corrigir outros NBSPs (ou seja, indesejados) manualmente e executar com Ctrl+ j.

    Notas:

    • Para tornar a solução permanente, adicione a função e os bind …comandos ao seu arquivo ~/.bashrc.

    • Se você optar por substituir Enter, a função será executada mesmo se Enterfor inserir uma nova linha após \ou dentro de uma string entre aspas (portanto, sem execução ainda). Isso não deve quebrar as coisas, desde que você queira que os NBSPs sejam convertidos. Ainda executar a função várias vezes quando a execução final sozinha faria todo o trabalho é deselegante. Por outro lado, a função não chama utilitários externos como sed, ela faz seu trabalho totalmente dentro do Bash, então mesmo chamá-la várias vezes em vão de vez em quando não é tão ruim.

      Mas se você colar um comando de várias linhas onde os NBSPs devem sobreviver (portanto, você usará Ctrl+ jcomo recomendado acima), os caracteres de nova linha sendo colados acionarão a função para fragmentos já colados. Para corrigir isso, investigue a pasta entre colchetes .

    • 3

relate perguntas

  • Qual seria o equivalente em lote do argumento "pass" do Python?

  • Não é possível ativar o Microsoft Print to PDF depois de desativado

  • execute o contêiner do docker como root

  • Como ativar o sensor de impressão digital no domínio e no diretório ativo do Linux

  • Como alterar permanentemente Ctrl + C para Ctrl + K no CentOS 7?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 Por que uma conexão de Internet gigabit/s via cabo (coaxial) não oferece velocidades simétricas como fibra? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve