Что делает команда 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не отображает функции оболочки.


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

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

я никогда не понять , почему люди ссылаются везде , кроме первого ... вы могли бы упомянуть различались 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.