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

Когда в командной строке bash вы вводите команду set без аргументов (которая должна вывести список переменных оболочки и их значений), прокручивается скрипт из 8 274 строк. Изучение этого сценария показывает, что это инструкции для оболочки по выполнению команд - и кажется, что он запускает сценарии Python, что делает его по сути огромным количеством чудовищных пропорций. Я видел, как другие встроенные программы ведут себя по-разному

Нет вывода:

Me:~$ wait
Me:~$ true
Me:~$ test

Ошибка без подсказки об использовании:

Me:~$ select
bash: syntax error near unexpected token `newline'

Ошибка с Подсказка:

Me:~$ source
bash: source: filename argument required
source: usage: source filename [arguments]
Me:~$ return
bash: return: can only `return' from a function or sourced script

У меня проблемы с пониманием, почему set ведет себя таким образом. Это кажется недокументированным, и я действительно не ожидал этого. Я обеспокоен тем, почему это происходит. Кто-нибудь может объяснить?

2
задан 21 February 2012 в 04:36

3 ответа

Попробуйте запустить 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
ответ дан 21 February 2012 в 04:36

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

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

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

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

0
ответ дан 21 February 2012 в 04:36

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

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

Та же документация, но с некоторыми примерами, может быть найдена по адресу: http://ss64.com/bash/set.html , а команда help set дает сводку этой информации.

1113 Итак, поведение, которое вы описываете, действительно правильное. Я согласен, что было бы неплохо, если бы была опция --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» привели меня к этой документации.

0
ответ дан 21 February 2012 в 04:36

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

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