¿Por qué mis teclas de flecha no funcionan en sh?

16

Recientemente instalé Ubuntu y cuando ejecuto sh en la Terminal, mis teclas de flecha no funcionan, así que no puedo revisar mi historial de llamadas o editar lo que esté escribiendo. Simplemente sale como personajes extraños como ^[[A.

El shell de inicio de sesión es bash y funciona bien, pero tan pronto como cambio a sh, no funcionan.

¿Cómo puedo arreglar esto?

Joe
fuente
2
¿Por qué cambias a sh?
Enone
2
@oenone ¿Por qué no importa por qué cambia el OP sh? Seguramente la razón de por qué lo hace es irrelevante para el hecho de que es problemático.
Agi Hammerthief

Respuestas:

15

El /bin/shshell (dash) es un shell de funcionalidad reducida que cumple con POSIX para que sea más eficiente (más pequeño) para arrancar el sistema. Como parte de eso, el historial y la edición avanzada de línea de comandos no están incluidos. Es más apropiado para secuencias de comandos POSIX estrictas que como un shell interactivo. La idea es que el shell de 'inicio de sesión' sea bash por defecto, pero el sistema de arranque usará un guión. La página del manual en Ubuntu 11.04 muestra que el guión tiene historial y edición de línea de comandos, pero el programa no tiene estas características. Eche un vistazo al tamaño de los ejecutables 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

Intenta acostumbrarte a correr $SHELLo en bashlugar de solo sh.

Arcege
fuente
8

En caso de que /bin/shsea Dash , debe configurarse --with-libeditantes de la compilación. De lo contrario, aún puede ejecutarse set -o vien el shell, pero no hace nada útil.


fuente
0

shno tiene historia Al menos, el mío no:

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*
Osito de peluche
fuente
1
De Verdad? De acuerdo con la especificación IEEE lo hace: pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
jasonwryan
@jasonwryan, notará que todo lo relacionado con el historial o el modo de edición de línea está marcado con un UP en esa especificación, lo que significa que es opcional (para la conformidad POSIX, no la conformidad Unix).
Stéphane Chazelas
@ StéphaneChazelas: tal vez sea cierto, pero jasonwryan es definitivamente correcto de todos modos. Aquí hay otro enlace . Y además - ¿se refiere a $FCEDITo $HISTFILEo incluso sólo fc? Pensé que al menos esos eran obligatorios, y la representación del $PS1 \!. Podría estar equivocado acerca de la especificación POSIX, pero todos funcionan dashy lo han hecho durante años.
mikeserv
1
@mikeserv, sin saber a qué se refiere, pero reiterar, todos fc, $FCEDIT, $HISTFILE, $PS1son opcionales en POSIX (marcado con UP para "Portabilidad del usuario"). Los shsistemas conformes con Unix tendrán aquellos que requieren UP para la conformidad con Unix (entre otras cosas, Unix también requiere esas echo -esalidas -e<LF>). Pero si un sistema / shell solo afirma la conformidad POSIX, entonces no necesita implementarlos. Para Debian ash, puede habilitarse en tiempo de compilación con --with-libedit como ya se mencionó, pero Debian al menos no.
Stéphane Chazelas
@ StéphaneChazelas: muchas gracias. El dashque uso como empaquetado para Arch es, por lo tanto, drásticamente diferente al de Debian. Esa es información valiosa. Extraño eso no está adentro man.
mikeserv