Что делает команда set без аргументов?

22

Что делает 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.

Александр Ковалев
источник
1
«Это встроено настолько сложно, что заслуживает отдельного раздела». Смотрите документы
Галат

Ответы:

17

set это встроенная оболочка, которая отображает все переменные оболочки, не только переменные окружения, а также функции оболочки, что вы и видите в конце списка.

Переменные отображаются с синтаксисом, позволяющим устанавливать их при выполнении или источнике строк.

С bash справочной страницы :

Если параметры или аргументы не предоставлены, set отображает имена и значения всех переменных и функций оболочки, отсортированных в соответствии с текущей локалью, в формате, который можно использовать повторно в качестве входных данных для установки или сброса текущих установленных переменных.

На разных оболочках поведение не обязательно одинаково; например, ksh setне отображает функции оболочки.

jlliagre
источник
3
Это потому, kshчто не храните определение функции в переменной оболочки.
cuonglm
2
@cuonglm Мудрое дизайнерское решение, принятое dgk! ;-)
jlliagre
7

Потому что setимеет вывод и which setничего не возвращает, вы знаете, что это часть оболочки, которую вы используете, скорее всего, bash.

man bash упоминает об этом много раз, но ссылки на него проще найти в онлайн-документации .

Эта встроенная программа настолько сложна, что заслуживает отдельного раздела. set позволяет изменять значения параметров оболочки и устанавливать позиционные параметры или отображать имена и значения переменных оболочки.

set имеет спецификацию вызова:

set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]

так что если вы хотите найти его в командной строке, вы можете выполнить поиск с помощью

/set.*abef
user1133275
источник
which setзависит от вашей оболочки. По крайней мере, zshсообщит об этом за вас. Вы также можете прочитать это для более подробной информации.
cuonglm
Вряд ли вопрос касается чего-либо, кроме bash, поскольку он имеет большое доминирование на рынке, и любому, кто использует оболочку не по умолчанию, не нужно будет задавать этот вопрос.
user1133275
6

setявляется встроенной оболочкой , используемой для установки и сброса параметров оболочки и позиционных параметров.

Без аргументов, setнапечатает все переменные оболочки (как переменные окружения, так и переменные в текущем сеансе), отсортированные в текущей локали .

Вы также можете прочитать документацию по bash .


Есть несколько предостережений.

set "$var"присвоит varзначение $1. Если $varначать с -или +, то $varконтент обрабатывался как последовательность параметров оболочки. Если $varсодержат какие-либо недопустимые параметры, большинство оболочек POSIX будет печатать ошибку. yashи zshв sh, kshэмуляция не только печать ошибки, но и установка допустимых параметров. Пока yashостанавливаются настройки параметров для первого недопустимого параметра, zshбудут назначены все из них. В yash:

var=-fxd; set "$var"

fи xбудет присутствовать $-, пока:

var=fdx; set "$var"

только fприсутствует в $-. В обоих случаях, fи xпредставит в $-с zshв shи kshэмуляции.

Чтобы защитить вас от этой ситуации, вы можете передать --первый аргумент для установки позиционного параметра, даже если он начинается с -или +:

var=-fdx; set -- "$var"

присвоит $varк $1, независимо от его содержания.

set -- без каких-либо дополнительных аргументов будут сброшены все позиционные параметры.

Если первый аргумент -, поведение не определено. Все известные оболочки POSIX будут сброшены xи vопции (кроме posh), и назначат что-либо после -позиционных параметров:

set -xv - -f

назначит -fдля $1. set -Также не сбрасываются позиционные параметры. Шили Ош тоже так себя ведет. Семейная реликвия не обнуляется vи xварианты.

Единственное исключение оболочки POSIX yash, которое рассматривается -как первый позиционный параметр:

$ yash -c 'set -xv - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
+ printf %s\n - -f
-
-f
+ printf %s\n cvx
cvx

Schily Sh даже ничего не делает, если -присутствует в аргументах:

$ schily-sh -c 'set -v - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
<blank line>
s

$ schily-sh -c 'set -v -- -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
-f
vs
cuonglm
источник
я никогда не понять , почему люди ссылаются везде , кроме первого ... вы могли бы упомянуть различались set -- $unset, set - $unset, set $unsetи set "$unset"и так далее - это обычно те расхождения , которые получают люди в такого рода проблемы в первую очередь.
mikeserv
@mikeserv: Ну, я добавил дополнительные детали, но я не понял, что вы имеете в виду, когда используете $unset.
cuonglm
@cuonglm Команда set $unsetбудет действовать точно так же, как и setдля неустановленной переменной. Но set "$unset" отметим, если unsetна самом деле это неустановленная переменная. A set - $unsetудаляет -vи -xустанавливает параметры (в bash).
@BinaryZebra: Ах, конечно, для меня лучше использовать unset_var. А также обратите внимание, что set "$unset"на самом деле установлено $1пустым. Это касается расширения оболочки, а не строго set, поэтому я не упоминаю об этом.
cuonglm
1
@mikeserv: поведение poshи yashразные, когда -появляются. Вы можете прочитать мой обновленный (и не стесняйтесь улучшить его).
cuonglm
2

Если вы работаете внутри оболочки bash, введите help set.

В конце справки напечатайте:

Если ARG не заданы, печатаются все переменные оболочки.

Таким образом, аргументы no setвыводят все переменные, известные оболочке.


источник
Интересно, set -x; setбыло бы полезно
ILMostro_7