Встроенные переменные включаются в вывод команды set
. ($0
и $@
вообще не являются переменными, даже специальными, поэтому они не включены - но $_
, $BASH_ALIASES
, $BASH_SOURCE
, $BASH_VERSINFO
, $DIRSTACK
, $PPID
и все остальные, которые являются встроенными переменными, присутствуют).
$0
, $*
, $@
и т. Д. Не являются встроенными переменными; вместо этого они специальные параметры . Семантика совершенно иная (вы можете использовать declare -p
для печати значения переменной, но не специального значения параметра; многие встроенные переменные теряют свое специальное поведение при переназначении, тогда как специальные параметры никогда не могут быть целью назначения; ).
http://wiki.bash -hackers.org / syntax / shellvars охватывает как встроенные переменные, так и специальные параметры.
Если ваша цель - создать журнал текущего состояния оболочки, я предлагаю следующее:
(set; set -x; : "$0" "$@") &>trace.log
set
выводит вещи, которые являются на самом деле встроенными переменными (включая $_
), и set -x
журнал выполнения : "$0" "$@"
будет содержать достаточно информации для воспроизведения всех специальных параметров, которые основаны на ваших позиционных параметрах ("$*"
, "$@"
и т. д.); тогда как вывод set
будет включать все остальные состояния.