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