Apa keajaiban yang memungkinkan saya untuk melengkapi file jarak jauh saat saya mengetik perintah scp?

16

Agaknya ini adalah fitur yang disediakan oleh beberapa plugin yang saya aktifkan di pengaturan oh-my-zsh saya (saya telah menggunakan zsh selama bertahun-tahun sekarang).

Saya perhatikan sejak saya menambahkan kunci publik saya ke server (sekarang saya bisa SSH ke server tanpa memasukkan kata sandi), ketika saya menulis scpperintah di shell saya, saya benar-benar dapat menyelesaikan path file jarak jauh tab!

misalnya

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

Saya menekan tab dan itu hanya berfungsi! (Adapun apa yang saya coba capai dengan perintah itu sendiri, saya akan gunakan scpuntuk "menyalin" ke stdout, dan memberi makan itu sebagai file untuk diff. Dengan cara ini saya bisa melihat perubahan yang tepat saya sebarkan ke server sebelum berlari rsync)

Saya ingin tahu tentang apa saja yang membuat ini bekerja dengan baik. Apakah ini sesuatu yang dibangun ke dalam scp yang terintegrasi dengan z shell? Atau sesuatu yang lain?

Steven Lu
sumber

Jawaban:

16

Oooh, saya menemukan penjelasan .

Mengutip bagian yang relevan:

Shell zsh dilengkapi dengan (lebih dari satu) fitur hebat, seperti penyelesaian tab jarak jauh. Jika Anda misalnya ingin menyalin file lebih dari scp, cukup tekan tab di bagian mana pun dari nama file pada host jarak jauh. zsh dapat membuat sesi ssh di latar belakang, dan mengambil informasi terkait untuk Anda, sehingga Anda dapat melengkapi tab melalui file jarak jauh.

Posting selanjutnya menunjukkan beberapa zstyledeklarasi yang mencapai penyelesaian, tapi saya sangat menyarankan menggunakan paket zsh seperti oh-my-zsh yang disebutkan di atas untuk membuat barang-barang ini dikelola oleh komunitas OSS untuk Anda.

Sesuatu yang tampaknya relevan, seperti yang terlihat pada sistem saya di dir .oh-my-zsh saya:

$ 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
sumber
Luar biasa !! Apakah fitur ini eksklusif untuk zsh. Apakah mungkin di bash.
shivams
1
@shivams ini mungkin relevan untuk kebutuhan bash Anda. Sepertinya mengatur oh-my-zsh jauh lebih mudah, ditambah zsh benar-benar bagus. Saya pikir jika Anda benar-benar peduli tentang itu, meskipun, tidak banyak yang dapat dilakukan zsh bash itu (dan sebaliknya tentu benar juga). Hanya soal seberapa banyak pekerjaan yang ingin Anda lakukan.
Steven Lu
7
@shivams Bagi saya itu selalu Hanya Bekerja di bash - Saya baru saja menekan "tab" secara naluriah pada suatu perintah scp dan cukup terkejut melihat bahwa itu diselesaikan secara otomatis! Googling, sepertinya Anda perlu menginstal paket bash-completion jika Anda belum memilikinya. Pertanyaan unix.se ini relevan.
Pont