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 -
также не сбрасывал позиционные параметры. Шили ош тоже так себя ведет. Heirloom sh не отключает параметры 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" "$-"'
s
$ schily-sh -c 'set -v -- -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
-f
vs