私はサブシェルを使用してコマンドを実行することが多いのですが、何かを実行する前にサブシェルを展開したい場合があります。この方法では、自分が何をしているのかを確認でき、これから何が起こるかを編集することもできます。
たとえば、サブシェルの結果を編集できるように、次のコマンド ラインを実行する前に展開するにはどうすればよいですか?
例えば
$ find -name "test.txt"
/tmp/test.txt
$ mv $(!!) /tmp/new.txt
サブシェルが拡張されたのを見たい前に次のようにコマンドを実行します。
$ mv /tmp/test.txt /tmp/new.txt
これを実行する方法はありますか?
答え1
shell-expand-line
( \e\C-e
) は bash のコマンド置換を展開します。
$ bind -p|grep shell-ex
"\e\C-e": shell-expand-line
$(!!)\e\C-e
前のコマンドを再度実行し、出力を挿入します。
"\eo": "$(!!)\e\C-e"
他のコマンド置換も展開しますが、 のようなコマンドはありませんshell-expand-word
。
bash 4.0 以降では、 を有効にしてglobstar
と入力し**/file.txt
、glob-complete-word
( \eg
) またはglob-expand-word
( \C-x*
) を使用することもできます。
答え2
便利なトリックがあります。次の行を ~/.inputrc に追加します (必要に応じてファイルを作成します)。
コントロール + x: シェルの行展開
履歴のみ、またはエイリアスのみ、あるいはその両方を展開するには、次のいずれかを実行することもできます。
Control-x: 履歴の展開行
または
コントロール+x: エイリアス展開行
または
Control-x: 履歴とエイリアスの展開行
これは収集されたこのブログから、 そしてSuperUserのこの質問非常に似ています: