Когда в командной строке 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
ведет себя таким образом. Это кажется недокументированным, и я действительно не ожидал этого. Я обеспокоен тем, почему это происходит. Кто-нибудь может объяснить?
Попробуйте запустить 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>
, чтобы узнать о них больше. Пустой вывод - это ожидаемый результат этих функций.
Эти 8k строк в основном являются функциями завершения из пакета bash-complete. На моем старом рабочем столе bash использует почти секунду, чтобы прочитать и определить все эти функции, большинство из которых я никогда не использую, поэтому я отключаю его.
Чтобы отключить его, отредактируйте ваш ~ / .bashrc, найдите эти три строки в конце и добавьте #
к каждой из линий.
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
. /etc/bash_completion
fi
В следующий раз, когда вы запустите интерактивный сеанс bash, set
выведет только около 50-100 строк; в основном переменные окружения и специальные переменные оболочки.
От http://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html :
Если нет опций или аргументов поставляются, set отображает имена и значения всех переменных и функций оболочки, отсортированные в соответствии с текущей локалью, в формате, который может быть повторно использован в качестве входных данных для установки или сброса текущих установленных переменных.
blockquote>Та же документация, но с некоторыми примерами, может быть найдена по адресу: http://ss64.com/bash/set.html , а команда
1113 Итак, поведение, которое вы описываете, действительно правильное. Я согласен, что было бы неплохо, если бы была опция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» привели меня к этой документации.