Многострочные фрагменты команд в истории bash на несколько строк (WSL)

В WSL команды, написанные в несколько строк, после выхода из bash Я не могу запустить его, это была одна команда, написанная многострочно, так как она разбивается на несколько строк в файле bash_history.

Я проверил ниже статус флагов и установка / отмена их не работали.

cmdhist
lithist

Есть ли другой флаг оболочки для этого мне нужно настроить?

Bash veriosn - 4.3, та же проблема на v4.4

Я обнаружил, что об этой ошибке сообщалось много лет назад, и похоже, она еще не исправлена ​​?! Также обратите внимание, что я также изменил HISTTIMEFORMAT, предложенный в комментариях в упомянутом отчете, но все еще та же проблема.

0 ответов

Я использую GNU bash версии 5.0.3(1) в Ubuntu 19.10. Я проверил и подтвердил, что проблема, описанная в вашем вопросе, существует.

Затем я решил это, используя следующие шаги. После этого я несколько раз выходил из bash и подтверждал, что проблема решена в моей системе. Многострочные команды сохраняются в~/.bash_history файл, извлечен и выполнен правильно.


Решение:

Пожалуйста, отредактируйте свой ~/.bashrc файл или создайте его, если он не существует.

Скопируйте и вставьте в него следующие три строки и сохраните:

shopt -s cmdhist
shopt -s lithist
HISTTIMEFORMAT='%F %T '

Из man-страниц bash:

cmdhist:

Если установлено, bash пытается сохранить все строки многострочной команды в одной записи истории. Это позволяет легко повторно редактировать многострочные команды.

литолог:

Если установлено и параметр cmdhist включен, многострочные команды сохраняются в истории со встроенными символами новой строки, а не с использованием разделителей точкой с запятой, где это возможно.

Однако, cmdhist а также lithistполезны, пока оболочка все еще открыта и работает по памяти. При выходе из оболочки команды сохраняются в~/.bash_historyфайл в виде отдельных строк без указания того, где начинается или заканчивается многострочная команда, а затем рабочая память очищается. Когда вы снова запустите оболочку, эти строки в файле истории bash (включая многострочные команды) будут считываться по одной строке за раз, и каждая строка будет обрабатываться и загружаться в рабочую память как одна команда, даже если это может быть часть многострочной команды, потому что~/.bash_history файл будет выглядеть так:

nano .bashrc 
exit
history 
for i in {1..10}
do
echo $i
done
cat .bash_history 
exit
history 
awk '
{ print $1}' <<<'first last'
history
exit

Следовательно, необходимость в HISTTIMEFORMATкоторый будет действовать как разделитель для отделения каждой команды от другой на основе ее отметки времени, будь то одна строка или многострочная команда. Итак~/.bash_history файл будет выглядеть так:

nano .bashrc 
#1581635697
exit
#1581635709
history 
#1581635729
for i in {1..10}
do
echo $i
done
#1581635743
cat .bash_history 
#1581635757
exit
#1581635773
history 
#1581635794
awk '
{ print $1}' <<<'first last'
#1581635801
history
#1581635808
exit

Из man-страниц bash:

HISTTIMEFORMAT:

Если эта переменная установлена, а не null, ее значение используется в качестве строки формата для strftime(3) для печати отметки времени, связанной с каждой записью истории, отображаемой встроенной функцией history. Если эта переменная установлена, метки времени записываются в файл истории, поэтому они могут сохраняться во время сеансов оболочки. При этом используется символ комментария истории, чтобы отличать отметки времени от других строк истории.

С этого момента многострочные команды будут извлекаться, обрабатываться и загружаться в рабочую память как единое целое (без разбиения их на отдельные строки и обработки каждой строки как отдельной команды), а historyвывод команды будет выглядеть так (даже после перезапуска bash):

raffa@Laptop:~$ history
   1  2020-02-14 05:25:19 nano .bashrc 
   2  2020-02-14 05:25:38 exit
   3  2020-02-14 05:25:50 history
   4  2020-02-14 05:27:50 for i in {1..10}
do
echo $i
done
   5  2020-02-14 05:28:05 cat .bash_history
   6  2020-02-14 05:28:14 exit
   7  2020-02-14 05:28:27 history
   8  2020-02-14 05:28:55 awk '
{ print $1}' <<<'first last'
   9  2020-02-14 05:29:06 history
  10  2020-02-14 05:29:16 exit
  11  2020-02-14 05:29:27 history

И многострочные команды будут правильно извлекаться, отображаться и выполняться после выхода.


Уведомление:

  • Вам нужно будет перезапустить текущий сеанс bash после редактирования и сохранения ~/.bashrc файл, чтобы активировать изменения.
  • Если ваш текущий ~/.bash_historyфайл или рабочая память bash уже содержат строки истории с ошибками форматирования, вам может потребоваться удалить (сначала сделайте резервную копию) вашу текущую историю bash, запустивhistory -w; history -c в терминале, который навсегда удалит всю вашу текущую историю bash.

Удачи

Другие вопросы по тегам