Як я можу перерахувати параметри bash'es для поточної оболонки?


27

Сам інтегратор bash має варіанти, тобто

Рядки 22-23 сторінки чоловіка Баша:

OPTIONS  
All of the  single-character shell options documented in the description of the set builtin command can be used as options when the shell is invoked.   In addition, bash interprets the following options when it is invoked:  
-c ...  
-i ...  
-l ...  
-r ...  

Я використовував кілька пошукових моделей на сторінці bash man на зразок:

  • /^\s*set
  • /list

Чи можливо роздрукувати список цих налаштувань, застосованих до поточної оболонки?

Відповіді:


26
printf %s\\n "$-"

Перерахує параметри однієї літери в одній рядку.

Цей параметр також може використовуватися як:

set -f -- ${-:+"-$-"}
echo *don\'t* *glob* *this*
set +f "$@"

Спочатку вимкніть -fрозширення ilename оболонки , одночасно зберігаючи значення для $-- якщо таке є - $1. Далі жодних +fглобусів не відбувається, і розширення останнього імені знову вмикається і, можливо, також вимикається.

Наприклад, якщо -fрозширення ilename було вже вимкнено, коли значення для $-першого збережено, то його збережене значення буде (принаймні) :

f

І коли setце запускається знову, воно працює:

set +f -f

Що просто повертає вас туди, де ви почали.

set +o

Буде перераховано всі setпараметри оболонки таблиці (див . Відповідь Джейсона щодо shoptздатних - це слово? - варіанти) у формі, безпечній для повторного введення оболонки. Таким чином ви також можете зробити:

state=$(set +o)
set -some -crazy -options
eval "$state"

Для збереження, зміни та відновлення стану параметрів оболонки відповідно.

Для обробки shoptіонів та setпараметрів таблиці за один раз:

state=$(set +o;shopt)
#do what you want with options here
eval "$state"

Ви також можете зателефонувати set без жодних аргументів, щоб додати список усіх встановлених в даний час змінних оболонки - також цитується для повторного введення в оболонку. І ви можете - в bash - додатково додати команду, typeset -fpщоб також включити всі заявлені в даний час функції оболонки. Ви можете зібрати це все разом і evalколи будете готові. Можна навіть зателефонувати aliasбез аргументів для більшої кількості однакових. Це ... все-таки може прикрити це. Я думаю, що є "$@"- що bash, мабуть, вам доведеться покласти в масив спочатку, перш ніж робити set.

Ні, також є trap. Це трохи смішно. Зазвичай:

trap 'echo this is my trap' 0
(echo this is my subshell; trap)

... просто надрукує, що це моя доподібна оболонка, тому що підпрограшка є новим процесом і отримує власний набір traps - і тому не успадковує жодних traps, окрім тих, які його батьків явно ігнорував - (як trap '' INT) .

Однак:

trap 'echo this is my trap' 0
save_traps=$(trap)

trapспеціально поводиться, коли це перша і єдина команда, запущена в підзакритті підстановки команд, оскільки вона відтворює список батьківського оболонки, який наразі встановлений trapsу форматі, який цитується для безпечного введення в оболонку. І так що ви можете зробити save_traps, то set без аргументів - і все інше вже було сказано - в значній мірі отримати блокування на їхні капітали оболонки. Можливо, ви хочете явно додати export -pта readonly -pвідновити оригінальні атрибути var оболонки.

У всякому разі, цього достатньо.


дякую, ваш код працює чудово. тож, щоб отримати повний список усіх варіантів, вам доведеться використовувати і те, set +o і shopt ? (як shoptвміння бути словом, settableвикористовується на сторінці чоловіка, тому shoptableпрацює для мене)
the_velour_fog

@ user4668401 - Я думаю, що це вдасться.
mikeserv

TL; DR, але +1000 для рішення 3 рядків змінить параметр і поверне його "як було". Саме це і потрібно для створення сценаріїв або копіювання / вставки інструкцій.
Бальміпур

@mikeserv Здається, що параметр -p потрібно додати при збереженні стану для включення shoptіонів, тобтоstate=$(set +o;shopt -p)
nkatsar

9

Зі manсторінки:

shopt
... Без опцій або з опцією -p відображається перелік усіх параметрів, які можна встановити, із зазначенням того, встановлений чи ні кожен.
shopt | grep on

надрукує список усіх включених параметрів.


що спрацювало, спасибі Чи знаєте ви, чи перераховано параметри, які можна встановити як setі shopt?
the_velour_fog

@ user4668401 Ні, setце набагато обширніше: див. сторінку "man man" .
Jasonwryan

І щоб перевірити, чи ввімкнено одну опцію:shopt <option>
kos

це буде включати опції з "on" у імені (тобто huponexit). найпростіший спосіб виправитиshopt | grep on$
Майк Д

6

Щоб перерахувати всі варіанти:

set -o

Для огляду конкретного варіанту:

set -o | grep <OPTION>

Візьміть варіант verboseяк приклад:

$ set -o | grep verbose
verbose         off

6

Варіанти ?: У bash є три групи варіантів.

  1. Параметри, прочитані або встановлені командою set.
    (використовуйте цю команду для посібника LESS=+/'set \[--abefhkmnptuvxBCEHPT\]' man bash:)
    Усі параметри з однієї літери:abefhkmnptuvxBCEHPT

    Також варіанти (які не мають однолітерного еквівалента):

    set -o emacs
    set -o history
    set -o ignoreeof
    set -o interactive-comments
    set -o pipefail
    set -o posix
    set -o vi
  2. Параметри, прочитані або встановлені командою shopt.
    (Прочитати керівництво цієї команди: LESS=+/'shopt \[-pqsu\]' man bash')
    Список досить довгий , але легко друкувати, використання:

    $ shopt -p

    або подібне (але не рівне):

    $ shopt
  3. Параметри , які можуть бути встановлені на закликання:
    (команда для ручної: LESS=+/'^INVOCATION' man bash)

    Усі setваріанти:

    bash -abefhkmnptuvxBCEHPT

    Усі shoptваріанти

    bash -O option

    Деякі варіанти, які мають значення лише при ВИМКНЕННІ bash:

    bash -lirsDc

    І, також (довгі варіанти):

    bash --debugger --help --init-file file --rcfile file --login \
         --noediting --noprofile --norc --posix --restricted \
         --verbose --version

Усі setпараметри однієї літери і -riнадруковані за допомогою $-.

-i      Interactive  
Only read with `$-` (if it contains an `i`).
-r      Restricted
Also read with `shopt -p restricted_shell

Наприклад:

$ echo 'echo $0 $-' | bash -abefhikmprtuvxBCEHPT -lri

Виклик bash як оболонки для входу повідомляється лише з shopt:

-l      Login
read with `shopt -p login_shell`

Таким чином:

$ echo 'shopt -p login_shell' | bash -abefhikmprtuvxBCEHPT -lri
shopt -s login_shell

Параметр -nне може бути перевірений жодним кодом, оскільки це означає: не виконувати жодного коду.


Параметри друку

Найкращий інструмент для перелічення параметрів запущеної оболонки, як ті, що встановлені, так setі ті, з якими shoptвстановлено, однаковий shopt. Щоб перелічити параметри набору:

shopt -o

Що діє саме так set -o. Використовуйте shopt -poдля отримання того ж результату, що і set +o.

Щоб переглянути перелічені варіанти:

shopt -p

З яких можна вибрати друк або встановлені, shopt -psабо знятіshopt -pu

Щоб отримати всі варіанти. Наскільки це можливо стільки довгих опцій, а деякі ( -sDc) про INVOCATION не можна надрукувати:

$ echo $-; shopt -p ; shopt -po

Щоб зберегти їх у змінній:

$ storeoptions="$(echo "set -$-"; shopt -p ; shopt -po)"

І змінна може бути використана для повернення всіх параметрів:

$ eval "$storeoptions"

1

Для огляду конкретного варіанту:

if shopt -q <OPTION>
then echo '<OPTION> is set'
fi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.