vi modo de edição em traço (/ bin / sh) [duplicado]

5

TL; DR : a página do manual do shell padrão diz que há o modo de edição vi, mas set -o vi na verdade não o ativa

Em muitos shells, incluindo dash , o padrão POSIX determina que set -o vi habilitará o modo de edição vi, no qual o usuário do shell interativo pode navegar usando o estilo vi dos atalhos. Em dash (o shell padrão do Ubuntu com link simbólico para /bin/sh ) isso não funciona, mesmo que a página man especifique que esse recurso está disponível.

Exemplo:

$ dash
$ set -o vi
$ hello wolrd^[I

O que deveria acontecer é que com o atalho Esc , Deslocamento + i o cursor deveria ter saltado para o início da linha . Como você pode ver, recebo um caractere de controle como saída. Eu pedi a alguns usuários que testassem isso no AskUbuntu Chat, e eles confirmaram o mesmo comportamento.

Note que isto não está relacionado ao emulador de terminal - eu o testei em 3 diferentes: xterm, gnome-terminal e terminator. Eu testei isso com outros shells, bash , mksh e ksh93 - todos funcionam corretamente como esperado, então isso é dash - apenas um problema.

    
por Sergiy Kolodyazhnyy 19.09.2016 / 04:44

1 resposta

1

Eu estava curioso sobre isso, então baixei um tarball de código-fonte dos downloads DASH upstream e extraiu os arquivos de origem. Eu verifiquei um arquivo LEIA-ME que deve fornecer informações sobre o programa e suas opções de criação, mas não havia, por isso executei ./configure --help e sua saída inclui:

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --with-libedit          Compile with libedit support

Assim, parece que a biblioteca libedit é usada para fornecer linha recursos de edição, mas este não é o padrão ao construir a fonte. Eu também encontrei esta resposta para uma mensagem de lista de discussão em set -o vi não trabalhando:

  

Acho que isso exige que o traço seja criado com o suporte ao libedit para funcionar.

Eu verifiquei quais bibliotecas estavam vinculadas ao executável dash no meu servidor Ubuntu e observei que libedit não estava incluído:

$ ldd /bin/dash
        linux-vdso.so.1 =>  (0x00007fffcfbd6000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f013a0b7000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f013a475000)

Eu imagino que quando os mantenedores do pacote Debian estão construindo o pacote dash , eles omitem essa configuração opcional, pois eles não querem que sh tenha dependências externas em outras bibliotecas. Eles provavelmente poderiam vincular a biblioteca estaticamente, mas a principal razão para usar dash as sh é manter o shell o menor e mais rápido possível para que os scripts de inicialização sejam executados rapidamente.

Editar : eu apenas procurei por " libedit dash " e o resultado principal foi uma pergunta muito semelhante neste site que foi bem respondida por muru.

Criando o Dash com suporte a edição de linha

Para quem estiver interessado, estas são as etapas necessárias para criar a partir do código-fonte.

  1. Faça o download do tarball de origem mais recente:

    wget http://gondor.apana.org.au/~herbert/dash/files/dash-0.5.9.tar.gz
    wget http://gondor.apana.org.au/~herbert/dash/files/dash-0.5.9.tar.gz.sha256sum
    
  2. Verifique a autenticidade do tarball:

    sha256sum -c <( awk '/dash/{ print  "  "  }' dash-0.5.9.tar.gz.sha256sum )
    gpg --verify --auto-key-retrieve dash-0.5.9.tar.gz.sha256sum
    
  3. Extraia os arquivos de origem e mude para o diretório de origem:

    tar -xf dash-0.5.9.tar.gz
    cd dash-0.5.9
    
  4. Execute ./configure --with-libedit para criar os arquivos Make. No entanto, isso falhará silenciosamente, a menos que a versão de desenvolvimento da biblioteca libedit esteja instalada. Seria melhor se o script de configuração fosse mais lamentável, pois não era óbvio que não estava conseguindo encontrar os arquivos necessários.

    sudo apt-get install libedit-dev
    ./configure --with-libedit
    
  5. Construa o programa e (opcionalmente) instale-o em /usr/local/bin :

    make
    sudo make install
    
por Anthony Geoghegan 19.09.2016 / 11:52