В 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
Каждый процесс оболочки имеет собственное представление о том, что такое история строки команды -. Когда интерактивная оболочка завершает работу, она записывает свою запомненную историю в ~/.bash_history
для следующей оболочки, но это степень взаимодействия между процессами оболочки.
В вашей команде ()
делает вилку оболочки копией самой себя для запуска команды history -d
.Дочерний процесс начинается с копии внутреннего состояния родителя, поэтому он знает историю и может вносить изменения в свою копию.
Однако, когда подоболочка завершает работу, ее копия истории (, которая была только что перезаписана ), отбрасывается вместе с остальной частью ее внутреннего состояния ). Подоболочка знает, что это подоболочка, поэтому она даже не удосуживается написать ~/.bash_history
.
Сценарий без источника обычно вообще не может манипулировать историей, потому что он интерпретируется свежей не-интерактивной оболочкой, которая даже не читает ~/.bash_history
при запуске.
Вы можете заставить оболочку вести себя как интерактивную, указав ее в командной строке:
#!/bin/bash -i
echo something
Оболочка, которая запускает этот скрипт, добавит свои команды (, которые включают в себя как строку shebang, так и echo something
), к ~/.bash_history
, которую она находит на диске. Но, конечно, это не влияет на -копию истории памяти процесса оболочки, вызывающего сценарий, и когда он выходит, изменения, внесенные сценарием в ~/.bash_history
, в любом случае будут потеряны.