Bash カスタム組み込み

Bash カスタム組み込み

カスタム組み込み関数bash(例:)を作成したいと思いますtime。可能ですか?そうでない場合は、別のシェルに存在できますか?

たとえば、私はこれをCWDのすべてのディレクトリで実行しmap find -name '*.js' | xargs grep func1たいと思います。find -name '*.js' | xargs grep func1すべて参考にしてくださいパイプ付きに渡されますmap

目標は、複数のディレクトリにわたってコマンドを適用することです。私は生産されたすべてmapをカバーするスクリプトを書いた。ただし、パイプ、リダイレクトなどを含むコマンドを実行するには、文字列内のすべての内容を引用する必要があります。これが起こらないようにする方法を探しています。eval$1ls

また、これが可能かどうか疑問に思います。 ;)

答え1

ATT ksh、bash、およびzshには、既存のシェルインスタンスに追加のコードをロードできる動的モジュールロードシステムと、新しい組み込み機能を実装するために動的にロードされたコードがあります。しかし、あなたは新しい組み込み機能以上のものを求めています。新しい構文が必要で、シェルはそれを処理できないと思います。シェルのソースコードでパーサーを変更する必要があります。

zshでは、目的の構文に近づくことができます。

for x (*/) (cd $x && pipeline)

エイリアスを作成できますが、alias map='for x (*/) (cd $x &&'最後にはまだ閉じる角かっこが必要です。粗雑なハッキングであなたの好みのフレーズを得ることができます。

alias map='map__PWD=$PWD; for x (./*/ "") cd $map__PWD${x#.}/ && [[ -z $x ]] || '

これは醜すぎて壊れやすく、一般化できないので説明しません。どのように機能するかを完全に理解していない場合は、使用を検討しないでください。

答え2

この場合、次のようになります。

find . -type f -name "*.js" -exec grep -qF "func1" {} \; -print

*.js現在のディレクトリ内または下に文字列を含むファイル名を見つけるだけで十分ですfunc1

現在のディレクトリのファイルを避けるには:

find . -mindepth 2 -type f -name "*.js" -exec grep -qF "func1" {} \; -print

を使用すると、-mindepth 2find深さ1」(つまり、現在のディレクトリ)のどれとも一致しません。

最後のタスクはデフォルトで要求されたタスクを実行します。grep現在のディレクトリのすべてのサブディレクトリで効果的に実行されます。

関連情報