Многострочные фрагменты команд в истории 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.
Удачи