Аномальный результат с использованием bash & ldquo; set & rdquo; команда

Это вроде как ожидалось, так как обновление с 16.04 по 18.04 еще не готово.

Это из примечаний к выпуску от 18.04:

Обновление с Ubuntu 16.04 LTS или 17.10 Обновление с 17.10 не будет включено до тех пор, пока несколько дней после выхода 18.04. Обновления с 16.04 LTS не будут включены до нескольких дней после выпуска 18.04.1, ожидаемого в конце июля.
2
задан 21 February 2012 в 06:36

3 ответа

Эти 8k-строки в основном являются функциями завершения из пакета завершения bash. На моем старом рабочем столе bash использует почти секунду для чтения и определения всех этих функций, большинство из которых я никогда не использую, поэтому я отключил его.

Чтобы отключить его, отредактируйте свой ~ / .bashrc, найдите эти три строки ближе к концу и добавьте # к каждой из строк.

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

В следующий раз, когда вы запустите интерактивную сессию bash, set будет выводить только около 50-100 строк; главным образом переменные среды и специальные переменные оболочки.

4
ответ дан 25 May 2018 в 14:07
  • 1
    Это объясняет, что здесь происходит. Большое спасибо. Запуск " набор " без аргументов должны отображаться переменные, которые «установлены». – Eric Weir 21 February 2012 в 02:49
  • 2
    @Eric Weir Если вы хотите видеть только набор переменных, вы также можете использовать declare -p, а также показывает, какой тип переменной он есть. declare -f показывает функции. Запустите help declare для краткого обзора того, как его использовать и прочитайте его вывод. – geirha 21 February 2012 в 14:41

Из http://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html:

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

Те же документы, но с некоторыми примерами, можно найти по адресу: http://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html [ ! d1], а команда help set дает сводку этой информации.

Таким образом, поведение, которое вы описываете, действительно правильно. Я согласен с тем, что было бы неплохо, если бы был вариант --help; обычно, когда все man set, apropos set, which set и whatis set не могут быть полезны, я попытаюсь передать --help в качестве опции. Это предотвращает запуск команды с непредвиденными результатами, поскольку она либо даст мне справочное сообщение, либо вызовет ошибку. В этом случае:

$ set --help
bash: set: --: invalid option
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]

Я считаю, что этот трюк является полезным отказоустойчивым.

Я должен указать, что первые несколько результатов Google для «bash set» привели меня к этому документация.

1
ответ дан 25 May 2018 в 14:07
  • 1
    Спасибо за ответ. Как вы говорите, есть опция помощи; это «набор справок». В противном случае, я думаю, вы не поняли проблему, потому что я не уверен, что ваш предложенный ответ. Нет, поведение, которое я описал, неверно; см. ответ от geirha. – Eric Weir 21 February 2012 в 02:51
  • 2
    Как я читал ваше сообщение, у вас было три вопроса: (1) «Кажется недокументированным», который я взял как неявную версию вопроса «Почему это не документировано / где это документировано?» & Quot; (2) «Это неожиданный результат», который я принял как неявную версию вопроса «Является ли это неожиданным результатом», и (3) «Мне кажется, это не нравится», что не является вопросом вообще. Феникс ответил первым двум, как мог бы дать вам двусмысленность. – Huckle 21 February 2012 в 05:48
  • 3
    Кроме того, поведение, которое вы описали, совершенно правильно. Согласно его первой ссылке. – Huckle 21 February 2012 в 05:52

Попробуйте запустить set | more и посмотрите в нижней части первого экрана. Вероятно, вы увидите что-то вроде этого:

SSH_CLIENT='XXX.XXX.XXX.XXX 54284 22'
SSH_CONNECTION='XXX.XXX.XXX.XXX 54284 68.232.126.14 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=114
USER=XXXXXXX
XDG_SESSION_COOKIE=740274408c1d635200f7415f00000009-1329686026.470247-1256968508
_=
__grub_script_check_program=grub-script-check
_scp_path_esc='[][(){}<>",:;^&!$=?`|\\'\''[:space:]]'
__expand_tilde_by_ref ()
{
    if [ "${!1:0:1}" = "~" ]; then
        if [ "${!1}" != "${!1//\/}" ]; then
...output truncated...       

, поэтому скрипт, на который вы ссылаетесь, - это умная (если не ясно) экранированная переменная оболочки. Что касается wait, test и true. Все они документированы с помощью man-страниц. Выпуск man <command>, чтобы узнать больше о них. Пустой вывод является ожидаемым результатом этих функций.

0
ответ дан 25 May 2018 в 14:07
  • 1
    Спасибо за ответ. Я так не думаю. Запуск " набор " больше " не превращает вывод в переменную оболочки. И, кстати, вы попробовали " человек ждать " сам? Вы не получаете команду оболочки bash " wait " если сделаете. – Eric Weir 21 February 2012 в 02:47
  • 2
    Я на самом деле не пытался wait, я пробовал test и true, потому что мне довелось знать, что они оба были встроенными. Кажется, wait нет, но это должно было быть очевидно, потому что man wait дает запись из раздела 2 (системные вызовы), поэтому which wait ничего не возвращает. – Huckle 21 February 2012 в 05:45
  • 3
    Кроме того, я не сказал, что он превращает вывод в переменную оболочки, я сказал, что вывод набора содержит скрипт. – Huckle 21 February 2012 в 06:35

Другие вопросы по тегам:

Похожие вопросы: