
Я пишу текст, Dockerfile
который форматирую с помощью табуляции (которую я обычно везде использую).
Но я скопировал многострочную команду, где вторая строка начинается с двух символов табуляции, то есть:
apt-get -y update && \
apt-get -y install collectd \ # begin two tabs
Первая строка выполняется правильно, но вторая строка пытается выполнить «автодополнение», показать все возможные команды, а затем:
> stall collectd
# [ apt-get updating ]
bash: stall: command not found
Я понимаю поведение "автодополнения", но stall collectd
... Почему Bash съедает apt-get -y in
часть?
решение1
Ответ Хаосачетко объясняет, как отключить это поведение, но я интерпретировал этот вопрос как вызванный любопытством относительно того, что случилось с первой частью команды apt-get
:
Если бы вы нажали две клавиши табуляции, Bash спросил бы вас, хотите ли вы это сделать,
Показать все 5177 вариантов? (да или нет)?
Обратите внимание, что количество возможностей зависит от вашей среды.
Если бы вы ответили любым из символов в строке apt-get -
, Bash проигнорировал бы их, поскольку ему нужны только да или нет. Когда он получает y
, он отображает все возможности.
В современных версиях Bash этот список отображается в пейджере, который имеет More?
подсказку внизу. Пейджер использует символ пробела для прокрутки страницы вниз, игнорирует следующие, i
но следующий символ n
интерпретируется как «Нет» для выхода из пейджера.
Наконец, оставшиеся символы stall collectd
интерпретируются оболочкой как команда.
решение2
Вы можете отключить поведение завершения bash
при нажатии tabклавиши:
bind 'set disable-completion on'
Теперь tabключ просто делает отступ строки, как в редакторе. Это временно. В следующем сеансе оболочки это не установлено. Если вы не хотите сделать это постоянным, добавьте это в свой ~/.inputrc
.
Для повторного включения tabключа используйте:
bind 'set disable-completion off'