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