Bashのコマンドで中括弧を使用するときは、タブ補完機能を使用したいと思います。
たとえば、
cp ~/html/{foo bar.txt whatever} /var/www/html/
中かっこで指定されたファイルのタブを完成させたい。
ベストアンサー1
これを解釈する方法は2つあります。 endの前に名前を入力すると、完成したい}
(他のディレクトリでファイルの完成を効果的に実行します)。または、拡張が完了し、endの後の(有効な)名前を変更しようとします}
。{ }
拡張機能は、拡張されたグロービングとは異なり、すべてのオプションを拡張します。既存のファイル名を指定しますが、スペースの代わりに「、」を使用してください。
{}
Bashを使用して単語リストを作成するための予想される方法は次のとおりです。
cp ~/html/{foo,bar.txt,whatever} ...
2つのオプションがあります。 readline キーバインディングをシェル関数にリンクするか、プログラムで行うことです。
readlineメソッドを使用すると、現在のコマンドを完全に書き直すことができますが、問題は現在のコマンドラインを表示しないため、解析の問題が少なくないことです。
プログラム可能な完成するpath/{
コマンドラインをトークン化しますが、現在の単語のみを変更/置換できます。つまり、編集中にプレフィックスを(簡単に)保持することはできません。
関連する唯一の基本的なbash機能は、bashがデフォルトで(Esc)にバインドされた「すべてのシェルワード拡張」を実行すると主張するreadline
機能です。これらの拡張は、マニュアルページ(bash-4.3)に示されている7つの拡張タイプのすべてであると合理的に期待できます。shell-expand-line
\M-\C-e
\C-e
Expansion is performed on the command line after it has been split into words. There are seven kinds of expansion performed: brace expansion, tilde expansion, parameter and variable expansion, command substitu‐ tion, arithmetic expansion, word splitting, and pathname expansion.
入力して試すことができます(Enterを押す必要はありません)。
echo {1..2} ~root $0 $LANG `echo foo` $((1+2) "a b" /etc/p[aeiou]*
次にMetaCtrlE(+メタ障害のあるキーボードを使用している場合ESC)。CtrlE
最初と最後の(中かっことパス)拡張の両方が機能しないため、ドキュメントと実装はIMHOと一致しません。
以下は、[拡張]タブを使用する完全なソリューションではなく、回避策です。ただし、正しい中括弧拡張構文を使用する必要があり、特に空白ではなくカンマを使用して項目を区切る必要があります。
function _expand() {
[[ -z "${READLINE_LINE}" ]] && return
eval local aa=( ${READLINE_LINE} ) # not-quoted, eval needed
[[ ${#aa} -eq 0 ]] && return # parse problem
printf -v READLINE_LINE "%s " "${aa[@]}"
READLINE_POINT=${#READLINE_LINE} # eol, predictable at least
}
bind -x '"\C-_":_expand'
これは配列を埋め、すべての通常の拡張(上記のレコードを除く)が発生するようにし、コマンドラインを再構築するCtrl_bash関数に関連付けられています。eval
入力を開始し、Ctrl_何かを展開したいときにクリックし、Return準備ができたら通常のキーを押します。
これはタブよりも強力ですが、入力行全体を拡張するため、精度が低下します。特に、さまざまなシェルメタ文字が単純なeval
ロジックを難読化する場合、期待どおりに拡張されないことがあります。
zsh
Bashソリューションを過度にエンジニアリングするのではなく、Gilleの提案を見る価値があります。