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 -
також не скидав позиційні параметри. Шилі ош теж поводиться так. Реліквія 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 -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