Можно ли "сбросить" все специальные переменные 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 будет включать в себя все другие государства.

Нет, не существует никакой функции, чтобы автоматически сделать это. Вы должны будете сами перечислить переменные - но это легко, потому что есть только несколько: Каковы специальные переменные оболочки знака доллара?

Другие вопросы по тегам