Почему мои клавиши со стрелками не работают в sh?


16

Я недавно установил Ubuntu, и когда я запускаю sh в Терминале, мои клавиши со стрелками не работают, поэтому я не могу просматривать историю вызовов или редактировать то, что я печатаю. Это просто выходит как странные персонажи ^[[A.

Оболочка входа в систему bash, и она работает нормально, но как только я переключаюсь на sh, они не работают.

Как я могу это исправить?


2
почему вы переключаетесь на ш?
Энон

2
@oenone Почему это важно, почему OP переключается на sh? Конечно, причина, по которой он это делает, не имеет отношения к тому, что это проблематично.
Agi Hammerthief

Ответы:


15

/bin/sh(Тир) оболочка представляет собой POSIX - совместимая, ограниченная функциональность оболочки , чтобы быть более эффективной (меньше) для загрузки системы. Как часть этого, история и расширенное редактирование командной строки не включены. Это больше подходит для строгих сценариев POSIX, чем в качестве интерактивной оболочки. Идея состоит в том, что оболочка 'login' будет по умолчанию bash, но система загрузки будет использовать dash. Страница man в Ubuntu 11.04 показывает, что dash имеет историю и редактирование в командной строке, но программа не имеет этих функций. Посмотрите на размер базовых исполняемых файлов.

$ 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

Попробуйте привыкнуть к бегу $SHELLили bashвместо просто sh.


8

В случае , если /bin/shэто черточка , он должен быть настроен --with-libeditперед компиляцией. В противном случае вы все равно можете запустить set -o viв оболочке, но это не делает ничего полезного.


0

shне имеет никакой истории По крайней мере, мой не:

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*

1
В самом деле? В соответствии со спецификацией IEEE это делает: pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
jasonwryan

@jasonwryan, вы заметите, что все, что связано с историей или режимом редактирования строк, помечено в этой спецификации знаком UP , что означает, что это необязательно (для соответствия POSIX, а не соответствия Unix).
Стефан Шазелас

@ StéphaneChazelas - возможно, правда, но Джейсонвриан определенно прав в любом случае. Вот еще одна ссылка . И к тому же - вы имеете в виду $FCEDITили $HISTFILEдаже просто fc? Я думал, что те, по крайней мере, были обязательными - и рендеринг $PS1 \!. Я могу ошибаться в спецификации POSIX - но все они работают dashи работают годами.
mikeserv

1
@mikeserv, не уверен , что вы имеете в виду, но повторим, все fc, $FCEDIT, $HISTFILE, не $PS1являются обязательными в POSIX (с пометкой UP для «User портативности»). shСистем Unix согласующихся будет иметь те , как UP требуется для Unix соответствия (среди прочего Unix также требует , чтобы echo -eвыходы -e<LF>). Но если система / оболочка только заявляет о соответствии POSIX, то им не нужно это реализовывать. Для Debian ashэто может быть включено во время компиляции с --with-libedit, как уже упоминалось, но Debian по крайней мере не делает.
Стефан Шазелас

@ StéphaneChazelas - большое спасибо. Поэтому dashя использую как упакованный для Arch, радикально отличается от того, что я использую Debian. Это ценная информация. Странно, что не в man.
mikeserv
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.