我添加了一個新的別名scp_using_rsync
,它使用rsync通過SSH將文件複製到特定選項。我想把scp的bash完成連接到這個別名。bash完成 - 在第一次調用命令時定義的完成功能
它的工作原理,當我加入這一行:
complete -o bashdefault -o default -o nospace -F _scp scp_using_rsync 2>/dev/null || complete -o default -o nospace -F _scp scp_using_rsync
唯一的問題是,我注意到,_scp
獲取我的bash環境中定義,只有當我嘗試至少一次製表完成與SSH/SCP那個外殼。所以如果我直接在新shell中運行scp_using_rsync
,我會得到_scp
找不到的錯誤。
從typeset -F
在之前一個新的外殼,並試圖爲ssh或scp命令選項卡完成後,該輸出清楚地表明瞭以下功能在嘗試首次製表完成後定義:
$ diff ~/.scratch/file1 ~/.scratch/file2
224a225,227
> declare -f _scp
> declare -f _scp_local_files
> declare -f _scp_remote_files
226a230
> declare -f _sftp
230a235,240
> declare -f _ssh
> declare -f _ssh_ciphers
> declare -f _ssh_macs
> declare -f _ssh_options
> declare -f _ssh_suboption
> declare -f _ssh_suboption_check
這些功能似乎在我的系統中定義在/usr/share/bash-completion/completions/ssh
。
這是我的2間相關的問題:
- 如何bash的身影從哪裏自動拾取的定義,並定義它們的時候完成的嘗試,第一次?
- 我應該如何將
scp_using_rsync
的bash完成以類似的方式鏈接到scp的bash完成?
鏈接到bash的手冊:[Programmable Completion](http:// www。 gnu.org/software/bash/manual/bashref.html#Programmable-Completion) – pynexj 2013-04-07 05:14:30
哇!不知道bash有一個選項可以即時加載新的完成。你是對的,我看到'/ usr/share/bash-completion/bash_completion'中定義了'_completion_loader()'函數,這似乎是源於'/ usr/share/bash-completion/bash_completion'中的所有文件,因此ssh/scp的完成會被加載。甜! :)我認爲對於我的用例,我會覆蓋並定義自己的完成加載器來定義預期的完成,然後在bash完成中調用它。 – Tuxdude 2013-04-07 05:16:45