
Ich schreibe einen Text Dockerfile
, den ich mit Tabulatoren formatiere (die ich normalerweise überall verwende).
Aber ich habe einen mehrzeiligen Befehl kopiert, bei dem die zweite Zeile mit zwei Tabulatorzeichen beginnt, also:
apt-get -y update && \
apt-get -y install collectd \ # begin two tabs
Die erste Zeile wird korrekt ausgeführt, aber die zweite Zeile versucht eine „Autovervollständigung“, zeigt alle möglichen Befehle an und dann:
> stall collectd
# [ apt-get updating ]
bash: stall: command not found
Ich verstehe das Verhalten der „Autovervollständigung“, aber stall collectd
? Warum frisst Bash diesen apt-get -y in
Teil?
Antwort1
Die Antwort des Chaoserklärt klar, wie man dieses Verhalten deaktiviert, aber ich habe diese Frage so interpretiert, als sei sie durch Neugier motiviert, was mit dem ersten Teil des apt-get
Befehls passiert ist:
Wenn Sie zwei Tabulatoren eingeben, fragt Bash, ob Sie möchten,
Alle 5177 Möglichkeiten anzeigen? (j oder n)?
Beachten Sie, dass die Anzahl der Möglichkeiten von Ihrer eigenen Umgebung abhängt.
Wenn Sie mit einem der Zeichen in der Zeichenfolge antworten würden apt-get -
, würde Bash diese ignorieren, da nur ein Ja oder Nein erwartet wird. Wenn es das erhält y
, zeigt es alle Möglichkeiten an.
In modernen Versionen von Bash wird diese Liste in einem Pager angezeigt, der More?
unten eine Eingabeaufforderung enthält. Der Pager verwendet das Leerzeichen, um eine Seite nach unten zu scrollen, ignoriert das Folgende, i
aber das nächste Zeichen n
wird als „Nein“ interpretiert, um den Pager zu verlassen.
Schließlich werden die restlichen Zeichen stall collectd
von der Shell als Befehl interpretiert.
Antwort2
Sie können das Vervollständigungsverhalten bash
beim Drücken der tabTaste deaktivieren:
bind 'set disable-completion on'
Jetzt tabrückt der Schlüssel die Zeile einfach wie in einem Editor ein. Dies ist nur vorübergehend. Bei der nächsten Shell-Sitzung ist es nicht gesetzt. Wenn Sie es dauerhaft machen möchten, fügen Sie es zu Ihrem hinzu ~/.inputrc
.
tabUm den Schlüssel wieder zu aktivieren, verwenden Sie:
bind 'set disable-completion off'