Неработающее завершение табуляции при make под linux

Я понятия не имею, как работает завершение табуляции, но вдруг мой сломался. Я даже не знаю, какую информацию предоставить, кроме варианта использования. в make-файле есть цель clean.

$ make c<tab> приводит к

$ make c23:set: command not found lean

EDIT: кажется, я каким-то образом испортил встроенный set bash, так как man set говорит No manual entry for set, а which set ничего не сообщает. Однако вызов set на терминале дает результат.

Я использую: GNU bash, версия 4.3.11(1)-выпуск (x86_64-pc-linux-gnu) и GNU Make 3.81


person Ciprian Tomoiagă    schedule 14.11.2014    source источник
comment
Нет man страницы для set. Попробуйте help set (help — это внутренняя команда BASH) или man bash или info bash.   -  person Aaron Digulla    schedule 31.03.2015
comment
Что возвращают type set и command set в оболочке? Что вы получите, если запустите set -x, а затем вызовете эту проблему?   -  person Etan Reisner    schedule 08.07.2015
comment
type set говорит, что это встроенный bash. command set выдает все мои переменные среды и массу функций bash. set -x выдает это по поводу ошибки: + 23:set +o posix bash: 23:set: команда не найдена   -  person user1794469    schedule 08.07.2015
comment
@ user1794469 моя проблема была связана с псевдонимом. попробуйте удалить свой и посмотреть, сохраняется ли проблема.   -  person Ciprian Tomoiagă    schedule 08.07.2015
comment
@EtanReisner ваш комментарий помог больше всего. не могли бы вы опубликовать это как ответ, чтобы отметить его решенным?   -  person Ciprian Tomoiagă    schedule 08.07.2015
comment
Я имел в виду command -V set, извините. Хотя, учитывая решение здесь, это тоже не помогло бы.   -  person Etan Reisner    schedule 08.07.2015
comment
Вы решили это, я просто помог отладить его. Примите ваш ответ.   -  person Etan Reisner    schedule 08.07.2015


Ответы (3)


благодаря комментарию Этана и указанию Аарона на где makefiles, мне удалось это отладить.

Я запустил set -x, чтобы отслеживать, что происходит при завершении табуляции. Вывод make c<tab> состоит в основном из команд из файла завершения bash для make, расположенного по адресу /usr/share/bash-completion/completions/make (1). Однако я заметил несоответствие между выводом и файлом. Ближе к концу вывод сказал:

+ local mode=--
+ ((  COMP_TYPE != 9  ))
++ set +o
++ grep --colour=auto -n -F posix
+ local 'reset=23:set +o posix'
+ set +o posix

Который я идентифицировал как соответствующий этим строкам из файла:

if (( COMP_TYPE != 9 )); then
    mode=-d # display-only mode
fi

local reset=$( set +o | grep -F posix ); set +o posix # for <(...)

Таким образом, на выходе получилось grep --colour=auto -n, а не просто grep. Действительно, я установил этот псевдоним для grep

Make заработало, как только я удалил псевдоним.

Я надеюсь, что это поможет другим отладить свои проблемы.

EDIT: я отправил отчет об ошибке здесь: https://alioth.debian.org/tracker/index.php?func=detail&aid=315108&group_id=100114&atid=413095

person Ciprian Tomoiagă    schedule 08.07.2015
comment
это почти не баг? Я имею в виду, что этот скрипт должен использовать /usr/bin/grep вместо того, чтобы полагаться на псевдонимы потенциальных пользователей? В любом случае, спасибо за решение, у меня также был такой же псевдоним в моем файле bashrc. - person claf; 08.07.2015
comment
Действительно, нарушение псевдонимов пользователей является довольно серьезным недостатком в этом скрипте завершения. Чтобы этого не произошло, следует использовать различные средства. - person Etan Reisner; 08.07.2015
comment
это кажется мне ошибкой, кто-то должен сообщить об этом. Я думаю, что добавление цвета в grep также является достаточно распространенным псевдонимом ... это исправление одного символа, чтобы просто использовать \grep в сценарии. Я добавил это к своему /usr/share/bash-completion/completions/make, и это было исправлено. Могу ли я разделить награду? Половина должна достаться @etan-reisner, а половина — @ciprian-tomoiaga. - person user1794469; 08.07.2015
comment
Это, безусловно, ошибка, и о ней следует сообщить. Но проблема была не в цвете (авто там не срабатывает), а в -n. - person Etan Reisner; 08.07.2015
comment
@user1794469 user1794469 Как я уже сказал в своем комментарии к сообщению (я не знал, что кто-то еще опубликовал награду), просто примите и наградите этот ответ. - person Etan Reisner; 08.07.2015

Посмотрите на /etc/bash_completion, /etc/bash_completion.d и/или /usr/share/bash-completion/completions. Вы должны найти файл make, содержащий скрипт, который будет вызываться при нажатии Tab.

Используйте систему упаковки вашего дистрибутива Linux, чтобы проверить файл (или, возможно, вернуться к более старой версии).

Другой причиной этого может быть что-то в Makefile, что сбивает анализатор в сценарии завершения BASH.

person Aaron Digulla    schedule 14.11.2014
comment
в /etc/bash_completion.d/ файла make нет :( В /etc/bash_completion тоже нет записи make... - person Ciprian Tomoiagă; 14.11.2014
comment
Затем следуйте этому совету: superuser.com/questions/142211/ - person Aaron Digulla; 14.11.2014
comment
извините за респаун этого, но я все еще не мог это исправить. Я жил с ним несколько месяцев, но теперь он мне очень нужен. Кроме того, я не думаю, что это Makefile, так как это происходит даже с самым простым Makefile. Кроме того, вы можете увидеть мою правку, пожалуйста? Спасибо! - person Ciprian Tomoiagă; 30.03.2015
comment
Файл завершения make находится в папке /usr/share/bash-completion/completions - person Ebrahimi; 17.10.2016

Не пытаюсь получить здесь какие-либо кредиты, но лучшее решение на самом деле немного скрыто в комментариях... Пожалуйста, проголосуйте этот комментарий вместо моего ответа!

простые шаги, чтобы исправить это:

sudo vi /usr/share/bash-completion/completions/make

найдите строку с инструкцией grep. Это должно выглядеть так:

local reset=$( set +o | grep -F posix ); set +o posix # for <(...)

добавьте "\" перед инструкцией "grep":

local reset=$( set +o | \grep -F posix ); set +o posix # for <(...)
person Pacheco    schedule 30.08.2017