Почему '!!' ярлык не в состоянии выполнить ранее выполненную команду?

14

Недавно я набрал на своем терминале

username:~$ !!

и получил ошибку от bash :

bash: !!: command not found

В то же время, это успешно, когда сделано под суперпользователем.

Я исследовал содержимое PATH моего пользователя и не нашел ничего подозрительного:

/home/username/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Вот вывод:

username:~$ history | tail
1993  date
1994  cal
1995  vcal
1996  uptime
1997  uname
1998  uptime
1999  uname
2000  uptime
2001  uname
2002  history | tail

Другой:

username:~$ echo foo
foo
username:~$ !!
bash: !!: command not found
Булат М.
источник
2
Это всегда случается? Что если ты побежишь, echo fooа потом !!? Также, пожалуйста, отредактируйте свой вопрос и добавьте вывод history | tailили около того. Есть ли у вашей командной сессии какая-либо история?
тердон
1
Какой у вас язык ввода? Вы используете стандартный английский или какую-то другую клавиатуру?
Сергей Колодяжный
5
histexpandУстановлены ли в вашей оболочке параметры? какой выход echo $-?
SteelDriver
2
@muru, ... выступая как бывший участник freenode #bash, я проводил много времени, советуя людям отключить его, не получая никакого отклика от других старейшин канала - люди были удивлены командами с !литералами, которых не соблюдали дополнительные цитаты были гораздо более распространенным явлением, чем поиск кого-то, кто хотел, чтобы функциональность расширения истории не была доступна в удобной для использования форме через readline.
Чарльз Даффи
1
@muru, я отключил его в середине моего файла конфигурации, когда слепо копировал содержимое .bashrc из одного из многих примеров файлов, которые я нашел в Интернете.
Булат М.

Ответы:

23

Расширение истории может быть отключено:

$ echo foo
foo
$ !!
echo foo
foo
$ set +o histexpand
$ set -o | grep hist
histexpand      off
history         on
$ echo foo
foo
$ !!
bash: !!: command not found

Попробуйте set -Hили set -o histexpand.

Мур
источник
@Serg set -o, или специальная переменная$-
muru
Хорошо, я вижу, это то, что ты делаешьset -o | grep hist
Сергей Колодяжный,