Jaka jest magia, która pozwala mi uzupełniać tabulatorami zdalne pliki po wpisaniu polecenia scp?

16

Prawdopodobnie jest to funkcja zapewniana przez niektóre wtyczki, które włączyłem w mojej konfiguracji oh-my-zsh (używam zsh od wielu lat).

Zauważyłem, odkąd dodałem mój klucz publiczny do serwera (teraz mogę SSH na serwerze bez wpisywania hasła), kiedy piszę scppolecenie w mojej powłoce, jestem w stanie uzupełnić tabulatory zdalnymi ścieżkami plików!

na przykład

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

Nacisnąłem klawisz Tab i to po prostu działa! (co do tego, co próbuję osiągnąć za pomocą samego polecenia, zamierzam użyć scpdo „skopiowania” do standardowego wejścia i przesłania tego jako pliku różnicowego. W ten sposób mogę zobaczyć dokładne zmiany, które wdrażam na serwerze przed bieganie rsync)

Jestem ciekawy, jakie elementy sprawiają, że to działa tak dobrze. Czy jest to coś wbudowanego w SCP zintegrowanego z powłoką Z? Albo coś innego?

Steven Lu
źródło

Odpowiedzi:

16

Och, znalazłem wyjaśnienie .

Aby zacytować odpowiednią część:

Powłoka Zsh zawiera (więcej niż jedną) wspaniałą funkcję (funkcje), takie jak zdalne uzupełnianie tabulatorów. Jeśli na przykład chcesz skopiować plik przez scp, po prostu wciśnij tab w dowolnej części nazwy pliku na zdalnym hoście. zsh jest w stanie ustanowić sesję ssh w tle i pobrać dla ciebie powiązane informacje, abyś mógł uzupełnić tabulatorem pliki zdalne.

W dalszej części postu pokazano niektóre zstyledeklaracje, które osiągnęły zakończenie, ale zdecydowanie sugerowałbym użycie pakietu zsh, takiego jak wspomniany oh-my-zsh, aby te rzeczy były utrzymywane przez społeczność OSS.

Coś na pozór istotne, jak widać w moim systemie w moim .oh-my-zsh reż:

$ 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
źródło
Niesamowity!! Czy ta funkcja dotyczy wyłącznie zsh. Czy to możliwe w bash.
shivams
1
@shivams może to być odpowiednie do twoich potrzeb bash. Wygląda na to, że konfiguracja oh-my-zsh jest po prostu dużo łatwiejsza, a zsh jest po prostu naprawdę fajne. Myślę, że jeśli naprawdę ci na tym zależy, nie ma wiele, że Zsh może zrobić to, czego bash nie potrafi (i na pewno jest też odwrotnie). Po prostu kwestia tego, ile pracy chcesz w to włożyć.
Steven Lu
7
@shivams Dla mnie to zawsze działało w trybie bash - po prostu instynktownie wcisnąłem „tab” pewnego dnia w poleceniu scp i byłem dość zaskoczony, widząc, że zostało ono automatycznie wykonane! Googlując się po okolicy, wygląda na to, że musisz zainstalować pakiet bash-complete, jeśli jeszcze go nie masz. To pytanie dotyczące unix.se jest istotne.
Pont