Встроенная команда bash set
, если она вызывается без аргументов, напечатает все переменные оболочки и среды, а также все определенные функции. Это делает вывод непригодным для людей и трудным для него grep
.
Как заставить встроенную команду bash set
печатать только переменные, а не функции?
Существуют ли другие команды, которые печатают только переменные оболочки без функций?
Примечание: bash различает переменные оболочки и переменные окружения. см. здесь Различие между переменными среды и экспортированными переменными среды в bash
источник
_
которых, от которых легко избавиться:(set -o posix ; set | grep -v ^_)
set -o posix; set | sed -e '/^_/,$d'; set +o posix;
(set -o posix; set)
. Без скобок поведение текущей оболочки Bash будет изменено в соответствии со стандартом Posix. (Не знаю, что это значит, но выглядит важно.) С скобками Bash остается неизменным.POSIXLY_CORRECT=y
и добавляетposix
к$SHELLOPTS
Вот некоторые обходные пути:
сломать:
declare
печатает каждую определенную переменную (экспортированную или нет) и функцию.declare -f
печатает только функции.comm -3
удалит все строки, общие для обоих. По сути это удалит функции, оставив только переменные.Чтобы печатать только переменные, которые не экспортируются:
Другой обходной путь:
Это будет печатать только переменные, но с некоторыми уродливыми атрибутами.
Вы можете вырезать атрибуты, используя ... cut:
Недостатком является то, что значение IFS интерпретируется, а не отображается.
Для сравнения:
Это делает довольно трудным использование этого вывода для дальнейшей обработки из-за того, что он находится
"
в одной строке. Возможно, некоторые IFS-фу можно сделать, чтобы предотвратить это.Еще один обходной путь, использующий
compgen
:Встроенный bash
compgen
предназначался для использования в скриптах завершения. Для этогоcompgen -v
перечислены все определенные переменные. Недостаток: в нем перечислены только имена переменных, а не значения.Вот хак, чтобы также перечислить значения.
Преимущество: это чисто решение Bash. Недостаток: некоторые значения перепутаны из-за интерпретации до конца
printf
. Также подоболочка из канала и / или цикла добавляет некоторые дополнительные переменные.источник
declare ...| cut
канал, если для переменной нет атрибутов? Я предполагаю, что--
используется в этом случае, но мне все еще непросто.sed
может быть безопаснее, то естьdeclare -p | sed 's/^.* \([^ ]\+\)$/\1/'
compgen
:)typeset
Встроенный странно имеет возможность показать только функции (-f
) , но не показывать только параметры. К счастью,typeset
(илиset
) отображает все параметры до того, как все функции, имена функций и параметров не могут содержать символы новой строки или знаки равенства, а символы новой строки в значениях параметров заключаются в кавычки (они отображаются как\n
). Таким образом, вы можете остановиться на первой строке, которая не содержит знака равенства:Это только печатает имена параметров; если вы хотите значения, измените
print $1
наprint $0
.Обратите внимание, что при этом печатаются все имена параметров (здесь параметры и переменные используются как синонимы), а не только переменные окружения («переменная окружения» является синонимом «экспортируемых параметров»).
Также обратите внимание, что это предполагает, что нет переменной среды с именем, которое не соответствует ограничениям bash на имена параметров. Такие переменные не могут быть созданы внутри bash, но могут быть унаследованы от среды при запуске bash:
источник
set | sed '/=/!Q'
Я не уверен, как можно
set
печатать только переменные. Однако, глядя на выводset
, я смог придумать следующее, которое, кажется, захватывает только переменные:В основном, я ищу строки, которые начинаются с букв, цифр или знаков препинания, за которыми следует «=». Из вывода, который я видел, он захватывает все переменные; Однако я сомневаюсь, что это очень портативно.
Если, как следует из вашего заголовка, вы хотите вычесть из этого списка экспортируемые переменные и, таким образом, получить список неэкспортированных переменных, то вы можете сделать что-то вроде этого
Чтобы немного это изменить, вот что он делает:
set | grep "^\([[:alnum:]]\|[[:punct:]]\)\+=" | sort > ./setvars
Надеемся, что он получает все переменные (как обсуждалось ранее), сортирует их и сохраняет результат в файле.&& env | sort
: После завершения предыдущей команды мы собираемся вызватьenv
и отсортировать ее вывод.| comm -23 ./setvars -
Наконец, мы передаем отсортированный выводenv
вcomm
и используем-23
опцию для вывода строк, уникальных для первого аргумента, в данном случае строк, уникальных для нашего вывода из set.Когда вы закончите, вы можете очистить временный файл, который он создал с помощью команды
rm ./setvars
источник
f () {|cat <<EOF|foo=bar|EOF|}
где|
представляет разрыв строки).Просто используйте команду
env
. Он не печатает функции.источник
Попробуйте команду printenv:
источник
В bash это будет печатать только имена переменных:
Или, если значения также необходимы, используйте:
источник
Дифференцирование на чистую оболочку, чтобы исключить также переменные из сценариев rc
версия с
comm
была бы слишком запутаннойисточник
Принятый ответ великолепен. Я предлагаю альтернативу, которая не требует настройки режима POSIX:
Вот техника, которую я использовал для сохранения состояния функции в файле, чтобы я мог продолжить его позже. Первый создает дамп состояния, а второй - просто список имен переменных.
Обе работают, сбрасывая строки, пока не найдут строку без символа '=', что происходит, когда в списке указана первая функция. Последний обрезает назначение.
источник