Что делает set
команда без аргументов?
Как я вижу, он печатает мои переменные окружения точно так же, как env
команда, но в алфавитном порядке. И далее это печатает некоторую различную информацию (переменные? Функции?) Как:
__git_printf_supports_v=yes
__grub_script_check_program=grub-script-check
...
quote ()
{
local quoted=${1//\'/\'\\\'\'};
printf "'%s'" "$quoted"
}
quote_readline ()
{
local quoted;
_quote_readline_by_ref "$1" ret;
printf %s "$ret"
}
Что это и откуда?
Я не могу найти информацию о set
команде без аргументов. На самом деле у меня вообще нет man
страницы для set
моего дистрибутива Linux.
Ответы:
set
это встроенная оболочка, которая отображает все переменные оболочки, не только переменные окружения, а также функции оболочки, что вы и видите в конце списка.Переменные отображаются с синтаксисом, позволяющим устанавливать их при выполнении или источнике строк.
С
bash
справочной страницы :На разных оболочках поведение не обязательно одинаково; например,
ksh
set
не отображает функции оболочки.источник
ksh
что не храните определение функции в переменной оболочки.Потому что
set
имеет вывод иwhich set
ничего не возвращает, вы знаете, что это часть оболочки, которую вы используете, скорее всего, bash.man bash упоминает об этом много раз, но ссылки на него проще найти в онлайн-документации .
set имеет спецификацию вызова:
так что если вы хотите найти его в командной строке, вы можете выполнить поиск с помощью
источник
which set
зависит от вашей оболочки. По крайней мере,zsh
сообщит об этом за вас. Вы также можете прочитать это для более подробной информации.set
является встроенной оболочкой , используемой для установки и сброса параметров оболочки и позиционных параметров.Без аргументов,
set
напечатает все переменные оболочки (как переменные окружения, так и переменные в текущем сеансе), отсортированные в текущей локали .Вы также можете прочитать документацию по bash .
Есть несколько предостережений.
set "$var"
присвоитvar
значение$1
. Если$var
начать с-
или+
, то$var
контент обрабатывался как последовательность параметров оболочки. Если$var
содержат какие-либо недопустимые параметры, большинство оболочек POSIX будет печатать ошибку.yash
иzsh
вsh
,ksh
эмуляция не только печать ошибки, но и установка допустимых параметров. Покаyash
останавливаются настройки параметров для первого недопустимого параметра,zsh
будут назначены все из них. Вyash
:f
иx
будет присутствовать$-
, пока:только
f
присутствует в$-
. В обоих случаях,f
иx
представит в$-
сzsh
вsh
иksh
эмуляции.Чтобы защитить вас от этой ситуации, вы можете передать
--
первый аргумент для установки позиционного параметра, даже если он начинается с-
или+
:присвоит
$var
к$1
, независимо от его содержания.set --
без каких-либо дополнительных аргументов будут сброшены все позиционные параметры.Если первый аргумент
-
, поведение не определено. Все известные оболочки POSIX будут сброшеныx
иv
опции (кромеposh
), и назначат что-либо после-
позиционных параметров:назначит
-f
для$1
.set -
Также не сбрасываются позиционные параметры. Шили Ош тоже так себя ведет. Семейная реликвия не обнуляетсяv
иx
варианты.Единственное исключение оболочки POSIX
yash
, которое рассматривается-
как первый позиционный параметр:Schily Sh даже ничего не делает, если
-
присутствует в аргументах:источник
set -- $unset
,set - $unset
,set $unset
иset "$unset"
и так далее - это обычно те расхождения , которые получают люди в такого рода проблемы в первую очередь.$unset
.set $unset
будет действовать точно так же, как иset
для неустановленной переменной. Ноset "$unset"
отметим, еслиunset
на самом деле это неустановленная переменная. Aset - $unset
удаляет-v
и-x
устанавливает параметры (в bash).unset_var
. А также обратите внимание, чтоset "$unset"
на самом деле установлено$1
пустым. Это касается расширения оболочки, а не строгоset
, поэтому я не упоминаю об этом.posh
иyash
разные, когда-
появляются. Вы можете прочитать мой обновленный (и не стесняйтесь улучшить его).Если вы работаете внутри оболочки bash, введите
help set
.В конце справки напечатайте:
Таким образом, аргументы no
set
выводят все переменные, известные оболочке.источник
set -x; set
было бы полезно