拡張機能でbashで最後のコマンドを表示する方法

拡張機能でbashで最後のコマンドを表示する方法

このような機能を使用しています。

$ find-grep () { find . -type f -name "$1" -print0 | xargs -0 grep "$2" ; }

入力後:

$ find-grep *.c foo

最後のコマンド文字列を拡張したいと思います。この場合:

find . -type f -name "*.c" -print0 | xargs -0 grep "foo"

簡単にできる方法はありますか?

ベストアンサー1

@slmのより健全なバージョン:

find-grep() {
  cmd=(find . -type f -name "$1" -exec grep "$2" {})
  printf '%q ' "${cmd[@]}"
  printf '+\n'
  "${cmd[@]}" +
}

(パイプやxargsここでは必要ありません)または:

find-grep () (
  set -x
  find . -type f -name "$1" -exec grep "$2" {} +
)

(範囲を制限するためにサブシェルを起動する()のではなく、注意してください。より多くのプロセスが分岐せず、実行されるプロセスがより早く完了することに注意してください。){}set -xforkfind

シェルがワイルドカード文字を拡張しないようにワイルドカード文字を引用する必要があることに注意してください。

find-grep '*.c' pattern

Up代わりに、キーを押したときに拡張コマンドが表示されるように履歴にプッシュするには、次のように書くことができます。

find-grep() {
  cmd=$(printf '%q ' find . -type f -name "$1" -exec grep "$2" {})+
  history -s "$cmd"
  eval "$cmd"
}

おすすめ記事