Я пытаюсь войти irb
сессия с определенными переменными среды из файла с этой командой:
$ env $(cat env.sh) irb
Но когда я пробую нажатие Tab
после того, как я ввожу env.
для завершения его я получаю этот после ошибки:
$ env $(cat env.-bash: unexpected EOF while looking for matching `)'
-bash: syntax error: unexpected end of file
Другая интересная вещь состоит в том, что, если я зарегистрирован как корень, эта ошибка не происходит.
Вот вывод find ~ -uid 0
:
$ find ~ -uid 0
/home/(redacted)/.rpmdb
/home/(redacted)/.rpmdb/Group
/home/(redacted)/.rpmdb/Conflictname
/home/(redacted)/.rpmdb/Installtid
/home/(redacted)/.rpmdb/Sha1header
/home/(redacted)/.rpmdb/Providename
/home/(redacted)/.rpmdb/__db.002
/home/(redacted)/.rpmdb/Requirename
/home/(redacted)/.rpmdb/Sigmd5
/home/(redacted)/.rpmdb/__db.001
/home/(redacted)/.rpmdb/Obsoletename
/home/(redacted)/.rpmdb/.dbenv.lock
/home/(redacted)/.rpmdb/Name
/home/(redacted)/.rpmdb/Basenames
/home/(redacted)/.rpmdb/Triggername
/home/(redacted)/.rpmdb/Packages
/home/(redacted)/.rpmdb/Dirnames
/home/(redacted)/.rpmdb/__db.003
Кто-либо может объяснить мне, почему это происходит и если так, как я фиксирую его в том, когда я не пользователь root?
Вы нашли ошибку в библиотеке Bash Completion используемой Ubuntu.
Что это означает?
Ubuntu пользуется библиотекой завершения удара для создания завершения удара умным. Эта библиотека живет в /usr/share/bash-completion/bash_completion
.
По существу эта библиотека объявляет несколько умных функций, которые знают о типичных командах и как завершить их. Каждый раз, когда Вы нажимаете Tab, функции в этой библиотеке вызваны и попытка завершить Вашу текущую командную строку. Так, например, если Вы вводите apt-get i
Вкладка это завершит это к apt-get install
. Если Вы не получаете ту библиотеку, у Вас только есть стандартное, примитивное завершение удара - так, например, если Вы вводите apt-get i
Вкладка не получив его, удар будет просто искать файлы в текущем каталоге, запускающемся с i
и попытайтесь завершить свою команду согласно этим именам файлов.
Почему это не происходящий как корень?
Поскольку, когда Вы используете sudo su
сделать себя root
, библиотека завершения удара не получена. Это отличалось бы, если бы Вы использовали sudo -i
сделать себя root
. Я держал пари, что Вы видите ошибку затем, не так ли? Посмотрите, например, 'sudo su -' по сравнению с 'sudo-i' по сравнению с 'sudo/bin/bash' - когда это имеет значение, который используется, или это имеет значение вообще? если Вы не знакомы с различиями.
В моем случае, как обычный пользователь, получена библиотека, когда я запускаю оболочку Bash потому что ~/.bashrc
источники /etc/bash_completion
какие источники /usr/share/bash-completion/bash_completion
.
Если я использую sudo -i
входить в систему как root
, библиотека получена потому что /etc/profile
источники /etc/profile.d/bash_completion.sh
какие источники /usr/share/bash-completion/bash_completion
.
Почему та ошибка происходит?
Попытайтесь выполнить эту команду:
$ eval 'quoted=$(cat' env.
bash: unexpected EOF while looking for matching `)'
bash: syntax error: unexpected end of file
Знакомые взгляды?;-) Действительно, это точно, что произошло негласно, когда Вы поражаете Вкладку в контексте, Вы описали. Более точно ошибка находится в функции _quote_readline_by_ref
объявленный /usr/share/bash-completion/bash_completion
. При определении источника того файла, необходимо иметь ту функцию в наличии. Поэтому следующая попытка это:
$ _quote_readline_by_ref '$(cat env.' quoted
bash: unexpected EOF while looking for matching `)'
bash: syntax error: unexpected end of file
Учитывая эти аргументы, функцию _quote_readline_by_ref
выполняет, среди прочего, это eval
упомянутый выше. Можно взглянуть, если Вам нравится. И когда Вы ввели env $(cat env.
Вкладка, негласно та функция была вызвана с точно теми аргументами. Таким образом, это - то, что произошло.
Это eval
взлом, как предполагалось, устранил другую проблему, но я предполагаю, что это представило эту другую ошибку в процессе.
Как я фиксирую его?
Оказывается, что об этой ошибке уже сообщили. После чтения того отчета об ошибках я вижу три способа зафиксировать его:
Исправьте его: В одном из комментариев в том отчете об ошибках кто-то предлагает заменить строку
[[ ${!2} == \$* ]] && eval $2=${!2}
в функции _quote_readline_by_ref
в файле /usr/share/bash-completion/bash_completion
строкой
[[ ${!2} == \$\'* ]] && eval $2=${!2}
Я рекомендую против выполнения этого. Человек, который записал, что комментарий, кажется, не разработчик завершения удара. Эти текущие исправления просто заставят левый операнд оператора оценивать ко лжи и таким образом предотвращать это eval
от случая. Однако без хорошего ведома того, что та функция, как предполагается, делает и в том, какими контекстами это называют, неясно, не повредит ли это потенциально некоторую другую намеченную функциональность.
Получите новейшую версию: Равно как и упомянуто в том отчете об ошибках, эта ошибка не присутствует в голове мерзавца (где среди других изменений функция _quote_readline_by_ref
был упрощен). Можно просто клонировать текущий пересмотр от Мерзавца:
git clone https://salsa.debian.org/debian/bash-completion.git
... и затем скопируйте новейшую версию bash_completion
сценарий к /usr/share/bash-completion
(никакая насущная необходимость скопировать старую версию, если это не заставляет Вас чувствовать себя более в безопасности - при испытании некоторых проблем, sudo apt-get install --reinstall bash-completion
должен вернуться любые изменения, которые Вы внесли очень хорошо.) Это - способ, которым я рекомендую, если Вы спешите получать зафиксированный.:-)
Обратите внимание, что ни одно из тех решений не сделает завершение удара в работе замены команды: как упомянуто в том же самом отчете об ошибках, это повреждается в Bash 4.3.