Was ist die Magie, die es mir ermöglicht, entfernte Dateien mit Tabulatoren zu vervollständigen, wenn ich einen scp-Befehl eingebe?

16

Vermutlich ist dies eine Funktion, die von einem Plugin bereitgestellt wird, das ich in meinem oh-my-zsh-Setup aktiviert habe (ich verwende zsh seit vielen Jahren).

Mir ist aufgefallen, dass ich, seit ich meinen öffentlichen Schlüssel zum Server hinzugefügt habe (jetzt kann ich ohne Eingabe eines Kennworts SSH zum Server ausführen), beim Verfassen eines scpBefehls in meiner Shell tatsächlich Remote-Dateipfade durch Tabulatoren vervollständigen kann!

z.B

$ diff <(scp Remoteuser@remote.domain.net:/var/www/html/

Ich drücke die Tabulatortaste und es funktioniert einfach! (Was ich versuche, mit dem Befehl selbst zu erreichen, verwende ich, um scpnach stdout zu "kopieren" und das als Datei in diff einzugeben. Auf diese Weise kann ich die genauen Änderungen sehen, die ich vor der Bereitstellung auf dem Server vorgenommen habe Laufen rsync)

Ich bin gespannt, welche Teile das so gut machen. Ist es etwas, das in scp eingebaut ist und in die z-Shell integriert wurde? Oder etwas anderes?

Steven Lu
quelle

Antworten:

16

Oooh, ich habe eine Erklärung gefunden .

So zitieren Sie den relevanten Teil:

Die zsh-Shell bietet (mehr als eine) großartige Funktion (en), z. B. die Remote-Tabvervollständigung. Wenn Sie beispielsweise eine Datei über scp kopieren möchten, drücken Sie einfach die Tabulatortaste an einer beliebigen Stelle des Dateinamens auf dem Remote-Host. zsh ist in der Lage, eine SSH-Sitzung im Hintergrund einzurichten und die zugehörigen Informationen für Sie abzurufen, sodass Sie die entfernten Dateien tabulatorisch abschließen können.

In diesem Beitrag werden einige zstyleDeklarationen aufgeführt, mit denen der Abschluss erreicht wird. Ich empfehle jedoch dringend, ein zsh-Paket wie das oben erwähnte oh-my-zsh zu verwenden, um dieses Zeug von der OSS-Community für Sie warten zu lassen.

Etwas anscheinend Relevantes, wie es auf meinem System in meinem .oh-my-zsh-Verzeichnis zu sehen ist:

$ ack scp 
plugins/common-aliases/common-aliases.plugin.zsh
85:zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%
[# ]*}//,/ })'

<...>
Steven Lu
quelle
Tolle!! Ist dieses Feature exklusiv für zsh. Ist es möglich in bash.
Shivams
1
@shivams Dies kann für Ihre Bash-Anforderungen relevant sein. Oh-my-zsh einzurichten scheint einfach viel einfacher zu sein, und zsh ist einfach sehr schön. Ich denke, wenn Sie sich wirklich darum kümmern, gibt es nicht viel, was zsh tun kann, was bash nicht kann (und das Gegenteil ist sicherlich auch der Fall). Einfach eine Frage, wie viel Arbeit Sie dafür bereit sind.
Steven Lu
7
@shivams Für mich hat es immer nur in Bash funktioniert - ich habe eines Tages instinktiv "tab" in einem SCP-Befehl gedrückt und war ziemlich überrascht zu sehen, dass es automatisch vervollständigt wurde! Beim googeln sieht es so aus, als müssten Sie das Bash-Completion-Paket installieren, wenn Sie es noch nicht haben. Diese unix.se-Frage ist relevant.
Pont