Изменить историю bash изнутри подоболочки в интерактивном сеансе

В bash есть два списка параметров. Один для магазина и один для набора .

Параметр extglob принадлежит к списку shopt .
Его значение можно напечатать с помощью shopt extglob или shopt -p extglob .

Такой вариант, как существительное , принадлежит к списку набора .
Его значение можно напечатать с помощью shopt -op nounset или shopt -o nounset .

Отметьте один вариант.

Чтобы напечатать конкретную опцию (не меняя ее) для shopt, используйте shopt -p name :

$ shopt -p xpg_echo
shopt -u xpg_echo

А для set используйте: shopt -po name (да, вы можете использовать shopt -op для списка set ).

$  shopt -po xtrace
set +o xtrace

Список вариантов.

Чтобы перечислить все параметры из shopt, используйте shopt (или многоразовый shopt -p ).
Также можно использовать shopt -s или shopt -u .

Список всех параметров для набора осуществляется с помощью set -o (связанный: set + o ).
Или: shopt -o эквивалентно set -o и shopt -op соответствует set + o .

Руководство

Из LESS = + / '^ * shopt \ [' man bash :

Без параметров или с параметром -p отображается список всех настраиваемых параметров , Если -s или -u используется без аргументов optname, отображение ограничивается теми параметрами, которые установлены или не установлены, соответственно.

Из LESS = + / '^ * set \ [' man bash :

Если -o не указан без имени параметра, печатаются значения текущих параметров. Если + o не указан без имени параметра, в стандартном выводе отображается серия команд set для воссоздания текущих настроек параметра.

Примеры

$ set -o
allexport       off
braceexpand     on
emacs           on
errexit         off
errtrace        off
functrace       off
hashall         on
histexpand      on
history         on
ignoreeof       off
interactive-comments    on
keyword         off
monitor         on
noclobber       off
noexec          off
noglob          off
nolog           off
notify          off
nounset         off
onecmd          off
physical        off
pipefail        off
posix           off
privileged      off
verbose         off
vi              off
xtrace          off

и

$  shopt -sp
shopt -s checkwinsize
shopt -s cmdhist
shopt -s expand_aliases
shopt -s extglob
shopt -s extquote
shopt -s force_fignore
shopt -s histappend
shopt -s histverify
shopt -s interactive_comments
shopt -s progcomp
shopt -s promptvars
shopt -s sourcepath

Стоит упомянуть о shopt -op , в котором фактически перечислены параметры set :

$ shopt -op
set +o allexport
set -o braceexpand
set -o emacs
set +o errexit
set +o errtrace
set +o functrace
set -o hashall
set -o histexpand
set -o history
set +o ignoreeof
set -o interactive-comments
set +o keyword
set -o monitor
set +o noclobber
set +o noexec
set +o noglob
set +o nolog
set +o notify
set +o nounset
set +o onecmd
set +o physical
set +o pipefail
set +o posix
set +o privileged
set +o verbose
set +o vi
set +o xtrace
1
21.04.2019, 16:15
1 ответ

Каждый процесс оболочки имеет собственное представление о том, что такое история строки команды -. Когда интерактивная оболочка завершает работу, она записывает свою запомненную историю в ~/.bash_historyдля следующей оболочки, но это степень взаимодействия между процессами оболочки.

В вашей команде ()делает вилку оболочки копией самой себя для запуска команды history -d.Дочерний процесс начинается с копии внутреннего состояния родителя, поэтому он знает историю и может вносить изменения в свою копию.

Однако, когда подоболочка завершает работу, ее копия истории (, которая была только что перезаписана ), отбрасывается вместе с остальной частью ее внутреннего состояния ). Подоболочка знает, что это подоболочка, поэтому она даже не удосуживается написать ~/.bash_history.


Сценарий без источника обычно вообще не может манипулировать историей, потому что он интерпретируется свежей не-интерактивной оболочкой, которая даже не читает ~/.bash_historyпри запуске.

Вы можете заставить оболочку вести себя как интерактивную, указав ее в командной строке:

#!/bin/bash -i
echo something

Оболочка, которая запускает этот скрипт, добавит свои команды (, которые включают в себя как строку shebang, так и echo something), к ~/.bash_history, которую она находит на диске. Но, конечно, это не влияет на -копию истории памяти процесса оболочки, вызывающего сценарий, и когда он выходит, изменения, внесенные сценарием в ~/.bash_history, в любом случае будут потеряны.

5
27.01.2020, 23:18

Теги

Похожие вопросы