bashカスタムビルトイン

bashカスタムビルトイン

bashたとえば、次のようなカスタム組み込みを構築したいと考えていますtime。これは可能ですか? 不可能な場合、別のシェルで可能ですか?

例えば、私はこれをやりたいです:そして、 CWD内のすべてのディレクトリ内でmap find -name '*.js' | xargs grep func1実行します。find -name '*.js' | xargs grep func1パイプを含むに渡されますmap

目標は、複数のディレクトリにコマンドを適用することです。生成されるものすべてにmapwhich evalsというスクリプトを作成しました。ただし、実行したいコマンドにパイプやリダイレクトなどが含まれている場合は、文字列内のすべてのものを引用符で囲む必要があります。そうしなくても済む方法を探しています。$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現在のディレクトリの各サブディレクトリで実行されます。

関連情報