Можно ли "сбросить" все специальные переменные bash с помощью команды, например env?
#!/bin/bash
env
Это выплевывает кучу переменных среды. $0, $@, $_ и т. Д. Не выводятся. Есть ли способ выкинуть их, как env
или же set
сваливает остальную часть окружающей среды? Я не имею в виду ничего подобного echo $0
или что-то еще, я хочу увидеть все возможные специальные переменные в их текущем состоянии без непосредственного вызова всех из них.
2 ответа
Встроенные переменные включены в вывод 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
будет включать в себя все другие государства.
Нет, не существует никакой функции, чтобы автоматически сделать это. Вы должны будете сами перечислить переменные - но это легко, потому что есть только несколько: Каковы специальные переменные оболочки знака доллара?