Warum funktioniert die Pfadvervollständigung in Bash nicht immer?

7

Bei verschiedenen Bash-Umgebungen (verschiedenen Installationen) habe ich unterschiedliche Verhaltensweisen in Bezug TABauf die Pfadvervollständigung, wenn ich danach auf die Befehlszeile drücke. Wo wird das gehandhabt?

Ein konkretes Beispiel:

Ich laufe cmakemit einem -DArgument:

cmake -DCMAKE_TOOLCHAIN_FILE=~/x-too<TAB>

es macht nichts. Während (beachten Sie den Abstand zwischen =und~

cmake -DCMAKE_TOOLCHAIN_FILE= ~/x-too<TAB> 

vervollständigt zu

cmake -DCMAKE_TOOLCHAIN_FILE= ~/x-tools

Auf anderen Systemen funktioniert es sogar ohne Leerzeichen zwischen = und ~.

Wo finde ich die zugehörigen Konfigurationsdateien und Werte?

Patrick B.
quelle

Antworten:

4

Linux-Autovervollständigungen funktionieren mit complete.

 ]➬complete -p  cmake
 complete -F _cmake cmake

Also ist _cmake verantwortlich.

]➬type _cmake > cmake.sh

Und jetzt sehen / debuggen Sie es einfach. Sie ändern beispielsweise _cmake_mine und rufen auf, um es zu testen:

. cmake.sh
complete -F _cmake_mine cmake

So erhalten Sie Hilfe für einen integrierten Bash-Befehl:

 help complete
 help [[
 help for
more2000
quelle
Ich wusste nie, dass helpdas manfür Bash gebaut wurde!
wisbucky
3

Du musst mit anfangen /etc/profile. Sehen Sie, welche anderen Dateien davon stammen ( .wahrscheinlich mit dem Befehl).

Zum Beispiel auf meinem Ubuntu-System,

  • /etc/profile Quellen alle * .sh-Datei in /etc/profile.d/
  • /etc/profile.d/bash_completion.sh Quellen /usr/share/bash-completion/bash_completion
  • diese Datei:
    • Richtet eine Completion Loader-Funktion ein, die angezeigt wird /usr/share/bash-completion/completions/
    • und Quellen ~/.bash_completion

Sie möchten diesen Pfad auf Ihren verschiedenen Systemen verfolgen. Vielleicht gibt es keine cmakeDatei in / usr / share / bash-vervollständigung / vervollständigungen / auf einer von ihnen.

Glenn Jackman
quelle
Danke, das hat mich verrückt gemacht. Aus irgendeinem Grund ist dies in Ubuntu 16.04 nicht immer eingerichtet.
Andres F.