Що робить команда 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команду без аргументів. Насправді у мене в дистрибутиві Linux взагалі немає manсторінки set.


1
"Цей вбудований настільки складний, що він заслуговує на власний розділ". Дивіться документи
галат

Відповіді:


17

set це вбудована оболонка, яка відображає всі змінні оболонки, не лише середовищі, а також функції оболонки, що саме ви бачите в кінці списку.

Змінні відображаються з синтаксисом, який дозволяє встановлювати їх при виконанні або пошуку рядків.

З bash сторінки керівництва :

Якщо не надано жодних параметрів чи аргументів, набір відображає імена та значення всіх змінних оболонок та функцій, відсортованих відповідно до поточного локалу, у форматі, який може бути використаний у якості введення для встановлення чи скидання заданих поточних змінних.

На різних оболонках поведінка не обов'язково однакова; наприклад, ksh setне відображає функції оболонки.


3
Це тому, kshщо не зберігайте визначення функції в змінній оболонки.
cuonglm

2
@cuonglm Розумне дизайнерське рішення, прийняте dgk! ;-)
jlliagre

7

Оскільки setвиводить і which setне повертає нічого, ви знаєте, що це частина оболонки, яку ви використовуєте, ймовірно, баш.

man bash згадує це багато разів, але простіше посилатися на це в онлайн-документації .

Цей вбудований настільки складний, що заслуговує власного розділу. Набір дозволяє змінювати значення параметрів оболонки та встановлювати позиційні параметри, або відображати імена та значення змінних оболонок.

Набір має специфікацію виклику:

set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]

тому якщо ви хочете знайти його у людині в командному рядку, з яким ви можете шукати

/set.*abef

which setзалежить від вашої оболонки. Принаймні zshповідомимо про це за вас. Ви також можете прочитати це для отримання більш детальної інформації.
cuonglm

Навряд чи питання стосується будь-якого, крім башмаку, оскільки він має велике домінування на ринку, і кожному, хто використовує оболонку, що не використовується за замовчуванням, не потрібно було б задавати це питання.
користувач1133275

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

я ніколи не зрозуміти , чому люди посилаються всюди , крім першого ... ви могли б згадати розрізнялися 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 no setдрукують усі змінні, відомі оболонці.


Цікаво, чи set -x; setбуло б корисно
ILMostro_7
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.