.NETでは、エイリアスとしてコロンまたは他のプレフィックスを使用します.bashrc
。
私がしばらく使っていたショートカットは次のようになりました。
alias :t="tmux"
alias :www="google-chrome --use-gl=desktop &>/dev/null &"
alias :ide="bash ~/netbeans-11.3/netbeans/bin/netbeans &>/dev/null &"
alias :bsh="/bin/bash"
alias :c="clear"
alias :d="docker"
alias :dc="docker-compose"
効果がありました。しかし、コロンが原因でオートコンプリートが機能しないという問題が発生しました。
complete -F _docker :d
完了を呼び出すと、:d
何も表示されません。
衝突でしたか?どうすれば解決できますか?衝突がもっと起こると思いますか?私は何が間違っていましたか?
答え1
Bashでは、コロンは違法ではありません。ニックネーム名前。明示的に禁止される文字は\
、、、、、、、、、、、、、、、、、、、、、、です。 "
'
<space>
<tab>
<newline>
|
&
;
(
)
<
>
/
$
`
=
あなたが持っていると仮定バッシュ完了インストール後に2つの問題が発生する可能性があります。最初の問題は通常、名前にコロンがあるかどうかにかかわらず、別名に関連しています。
完了関数は遅延ロードされます。
# In a freshly opened shell $ alias bar='docker' $ complete -F _docker bar $ declare -pF _docker bash: declare: _docker: not found # Typing "bar", TAB, TAB: $ bar bash: completion: function `_docker' not found
この問題を解決するには、必要な関数を明示的にロードすることができます(または、デフォルトの完成関数の周りにラッパーを作成し、
_completion_loader
エイリアスも処理することができます)。# ...continue $ _completion_loader docker $ declare -pF _docker declare -f _docker # Typing "bar", TAB, TAB: $ bar attach container ...
読書船(ライン編集とプログラム可能な完成Bash)に含まれる項目を処理します。
COMP_WORDBREAKS
変数は単語区切り文字として機能し、デフォルトでは:
コロンPATH
で区切られたパスのリストを含む変数への割り当てなどのユースケースをサポートするためにその中に配置されます。したがって、コマンドラインを
完成しようとすると、完成関数に完成する必要がある誤った単語の配列が提供されます。:foo
具体的には、COMP_WORDS
1つの空の文字列の代わりに空の文字列に:
なります。foo
:foo
これはbash-completionで言及されました。GitHubのよくある質問。 「問題。コロンを含む操作を完了しようとすると、完了エラーが発生します。」を参照してください。
このFAQで提案されている唯一の解決策は、コマンドラインからコロンをバックスラッシュにエスケープすることです。
# In a freshly opened shell $ alias :foo='docker' $ complete -F _docker :foo $ _completion_loader docker # Typing "\:foo", TAB, TAB: $ \:foo attach container ...
残念ながら、コマンドの前にバックスラッシュを追加すると、Bashはエイリアス拡張を実行できず、「コマンドが見つかりません」というエラーが発生します。ただし、エイリアスの代わりに関数(たとえば)を定義するオプションがある場合、
:d () { docker "$@"; }
このソリューションは機能します。もちろん、
:
fromを削除することもできますが、これにより、次のようにコマンドラインのオートコンプリートがCOMP_WORDBREAKS
中断されます。PATH
$ COMP_WORDBREAKS=${COMP_WORDBREAKS/:/} # Typing "PATH=/bin:/", TAB doesn't complete any further: $ PATH=/bin:/