Bash では、引数内のコマンド名とファイル名を TAB キーで補完できます。しかし、コマンドに共通のオプションも含めないのはなぜですか? さらに良いことに、オプションが何をするかを教えてくれる補完システムもありませんか?
プログラマブル補完について聞いたことがあります..しかし、それがどこに適合するのかわかりません..
私の質問は次のとおりです。私が求めていることを達成する方法はありますか? Bash と組み合わせる他のツールは、おそらく..または何か?
Bash では、引数内のコマンド名とファイル名を TAB キーで補完できます。しかし、コマンドに共通のオプションも含めないのはなぜですか? さらに良いことに、オプションが何をするかを教えてくれる補完システムもありませんか?
プログラマブル補完について聞いたことがあります..しかし、それがどこに適合するのかわかりません..
私の質問は次のとおりです。私が求めていることを達成する方法はありますか? Bash と組み合わせる他のツールは、おそらく..または何か?
さらにすばらしい完成度が必要な場合は、zshを調べてください。これは bash によく似ており、ksh、tcsh などの優れた機能をいくつか取り入れています。また、bash の厄介なバグのいくつかを修正しています。
scp のリモート ファイル名の補完 (キーベースの認証が設定されている場合) や、タブ補完時のミニ ドキュメントなど、非常に優れた機能を実行できます。 :
[steven@sexy:~]% jar <tab>
0 -- store only without using ZIP compression
M -- do not create manifest file
etc...
bash
OS X では、 MacPorts を使用して事前定義された補完のセットを簡単にインストールできます。手順はこちらです。の例を見ると、/opt/local/etc/bash_completion.d
追加の例を作成するためのアイデアが得られるかもしれません。
bash の公式マニュアル ページは次のとおりです: Bash Reference Manual: Programmable Completion
これは bash の標準機能です:プログラマブル補完。
Bash は引数の補完をサポートしています: http://www.debian-administration.org/articles/316
Bash 補完は非常にカスタマイズ可能で、一般的なコマンドのオプションを表示できます。構成ファイルはそのように指定するだけです。Debian では、bash 補完には、さまざまなコマンドのオプションを補完するさまざまな構成ファイルのセットが付属しています。
例えば:
alanhaggai@neon:~$ tar
A c d r t u x
ここでの回答はどれも気に入らないので、具体的な例をいくつか提供したいと思います。
共通のプレフィックスを持つディレクトリがいくつかある場合があり、ディレクトリ名の途中または最後にあるディレクトリ名の一意の部分を入力するだけで、それらに cd して補完できるようにしたいと考えていました。
これを達成するための補完関数を書くことができました:
_cd(){
# Backup old nullglob setting
local shoptbakup="`shopt -p nullglob`"
shopt -s nullglob
local cur opts i opt
local IFS=$'\n'
cur="${COMP_WORDS[COMP_CWORD]}"
# Home directory substitution
if [[ "${cur:0:1}" == '~' ]]; then
cur="$HOME/${cur:1}"
fi
if [[ $cur == */* ]]; then
opts=(${cur}*/)
else
opts=(*${cur}*/)
fi
# Prevent trailing//
i=0
for opt in "${opts[@]}"; do
#opts[$i]=${opt%${opt##*[!/]}}
opts[$i]=${opt%/}
i=$((i+1))
done
# Restore nullglob setting
eval "$shoptbakup" 2>/dev/null
COMPREPLY=("${opts[@]}")
}
complete -o filenames -o bashdefault -o nospace -F _cd cd
だから今、私のプロンプトからこれを行うことができます:
$ ls
test 6/ test 7/ test 8/ test1/ test2/ test3/ test4/ test5/
$ cd 7[TAB]
そして、次のように自動的に完了します。
$ cd test\ 7/
プログラマブル補完を使用するもう 1 つの理由は、スクリプトを記述し、オプションを一覧表示または補完できるようにする場合です。このページには、本当に良い例がいくつかあります。
http://fahdshariff.blogspot.com/2011/04/writing-your-own-bash-completion.html
次に例を示します。
listanimals というスクリプトがあるとします。オプションの入力を支援する補完関数を書くことができます
# complete sendevent
_listanimals()
{
local cur=${COMP_WORDS[COMP_CWORD]}
local prev=${COMP_WORDS[COMP_CWORD-1]}
if [[ $prev == "--sort-direction" ]]; then
COMPREPLY=( $( compgen -W "horizontal vertical" -- $cur ) )
return 0
elif [[ $prev == "--type" ]];then
COMPREPLY=( $( compgen -W "mammals reptiles birds fish marsupials insects misc" -- $cur ) )
return 0
elif [[ $prev == "--size" ]]; then
COMPREPLY=( $( compgen -W "tiny small medium large huge" -- $cur ) )
return 0
fi
# completing an option
if [[ "$cur" == --* ]] || [[ $cur == "" ]]; then
COMPREPLY=( $( compgen -W "--sort-direction --type --size" -- $cur ) )
fi
}
complete -F _listanimals listanimals
今、私はこれを行うことができます:
$ listanimals --[TAB][TAB]
--size --sort-direction --type
$ listanimals --t[TAB]
これは自動的に次のように入力されます:
$ listanimals --type
次に、これを行うことができます:
$ listanimals --type [TAB][TAB]
birds fish insects mammals marsupials misc reptiles
そして、あなたは残りを理解できると確信しています。これは実用的な例なので、試してみたい場合は、ファイル (例: sample.sh) にコピーして貼り付け、 bash でソース化してsource sample.sh
ください。実際には、listanimals という名前のスクリプトは必要ありません。
理解するのが面倒だと思ったので、誰かがこれを役に立つと思ってくれることを願っています。