Por que minhas teclas de seta não funcionam em sh?

16

Eu instalei recentemente o Ubuntu e, quando executo sh no Terminal, minhas teclas de seta não funcionam, então não posso passar pelo meu histórico de chamadas ou editar o que estiver digitando. Ele só aparece como personagens estranhos ^[[A.

O shell de login é bash e funciona bem, mas assim que eu mudo para sh, eles não funcionam.

Como posso consertar isso?

Joe
fonte
2
por que você muda para sh?
oenone 30/09/11
2
@oenone Por que não importa por que o OP muda para sh? Certamente a razão pela qual ele faz isso é irrelevante para o fato de ser problemático.
Agi Hammerthief

Respostas:

15

O /bin/shshell (traço) é um shell de funcionalidade reduzida compatível com POSIX para ser mais eficiente (menor) para inicializar o sistema. Como parte disso, o histórico e a edição avançada da linha de comando não estão incluídos. É mais apropriado para scripts estritos do POSIX do que como um shell interativo. A ideia é que o shell de 'login' seja bash por padrão, mas o sistema de inicialização usaria o dash. A página de manual no Ubuntu 11.04 mostra que o dash tem histórico e edição de linha de comando, mas o programa não possui esses recursos. Dê uma olhada no tamanho dos executáveis ​​base.

$ ls -l /bin/*ash /bin/sh
-rwxr-xr-x 1 root root 822420 Mar 31 15:26 /bin/bash
-rwxr-xr-x 1 root root  83848 Nov 15  2010 /bin/dash
lrwxrwxrwx 1 root root      4 May 17 21:15 /bin/rbash -> bash
lrwxrwxrwx 1 root root      4 May 17 21:15 /bin/sh -> dash
$ strings /bin/bash | egrep -ci 'fc|hist'
181
$ strings /bin/dash | egrep -ci 'fs|hist'
1

Tente se acostumar a correr $SHELLou em bashvez de apenas sh.

Arcege
fonte
8

No caso /bin/shé traço , tem que ser configurado --with-libeditantes da compilação. Caso contrário, você ainda poderá executar set -o vio shell, mas ele não fará nada de útil.


fonte
0

shnão tem histórico. Pelo menos, o meu não:

server$ sh
\h$ history 
sh: history: not found
\h$ fc
sh: fc: not found
\h$ exit
server$ type sh
sh is hashed (/bin/sh)
server$ ll /bin/sh
lrwxrwxrwx 1 root root 4 Jun  1 18:43 /bin/sh -> dash*
Urso de pelúcia
fonte
1
Verdade? De acordo com a especificação IEEE que ele faz: pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
jasonwryan
@jasonwryan, você notará que qualquer coisa relacionada ao histórico ou ao modo de edição de linha é marcada com um UP nessa especificação, o que significa que é opcional (para conformidade com POSIX, não conformidade com Unix).
Stéphane Chazelas
@ StéphaneChazelas - talvez seja verdade, mas jasonwryan está definitivamente correto de qualquer maneira. Aqui está outro link . E além do mais - você está se referindo a $FCEDITou $HISTFILEou apenas fc? Eu pensei que esses pelo menos eram obrigatórios - e a renderização do $PS1 \!. Eu posso estar errado sobre a especificação POSIX - mas todas elas funcionam dashhá anos.
mikeserv
1
@mikeserv, não tenho certeza que você quer dizer, mas para reiterar, todos fc, $FCEDIT, $HISTFILE, $PS1são opcionais no POSIX (marcada com UP para "Portabilidade do Usuário"). Os shsistemas conformes ao Unix terão aqueles que UP é necessário para conformidade com o Unix (entre outras coisas, o Unix também exige que as echo -esaídas -e<LF>). Mas se um sistema / shell reivindicar apenas a conformidade com POSIX, não será necessário implementá-los. Para o Debian ash, ele pode ser ativado em tempo de compilação com --with-libedit como já mencionado, mas o Debian pelo menos não.
Stéphane Chazelas
@ StéphaneChazelas - muito obrigado. O que dasheu uso como empacotado para o Arch é, portanto, drasticamente diferente do que eu aceito pelo Debian. Essa informação é valiosa. Estranho que não esteja man.
mikeserv