Заполнение клавишей Tab Bash: '-удар: неожиданный EOF при поиске соответствия')' - удар: синтаксическая ошибка: неожиданный конец файла

Я пытаюсь войти 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?

18
задан 22 October 2017 в 06:33

1 ответ

Вы нашли ошибку в библиотеке 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 взлом, как предполагалось, устранил другую проблему, но я предполагаю, что это представило эту другую ошибку в процессе.

Как я фиксирую его?

Оказывается, что об этой ошибке уже сообщили. После чтения того отчета об ошибках я вижу три способа зафиксировать его:

  1. Исправьте его: В одном из комментариев в том отчете об ошибках кто-то предлагает заменить строку

    [[ ${!2} == \$* ]] && eval $2=${!2}
    

    в функции _quote_readline_by_ref в файле /usr/share/bash-completion/bash_completion строкой

    [[ ${!2} == \$\'* ]] && eval $2=${!2}
    

    Я рекомендую против выполнения этого. Человек, который записал, что комментарий, кажется, не разработчик завершения удара. Эти текущие исправления просто заставят левый операнд оператора оценивать ко лжи и таким образом предотвращать это eval от случая. Однако без хорошего ведома того, что та функция, как предполагается, делает и в том, какими контекстами это называют, неясно, не повредит ли это потенциально некоторую другую намеченную функциональность.

  2. Получите новейшую версию: Равно как и упомянуто в том отчете об ошибках, эта ошибка не присутствует в голове мерзавца (где среди других изменений функция _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.

  1. Расслабьтесь и ожидайте: Рано или поздно новая версия будет выпущена (который может даже зафиксировать завершение удара в замене команды), и Вы получите его с некоторой будущей версией Ubuntu. Это - то, для чего я иду ;-)
33
ответ дан 23 November 2019 в 02:07

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

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