カスタム組み込み関数bash
(例:)を作成したいと思いますtime
。可能ですか?そうでない場合は、別のシェルに存在できますか?
たとえば、私はこれをCWDのすべてのディレクトリで実行しmap find -name '*.js' | xargs grep func1
たいと思います。find -name '*.js' | xargs grep func1
すべて参考にしてくださいパイプ付きに渡されますmap
。
目標は、複数のディレクトリにわたってコマンドを適用することです。私は生産されたすべてmap
をカバーするスクリプトを書いた。ただし、パイプ、リダイレクトなどを含むコマンドを実行するには、文字列内のすべての内容を引用する必要があります。これが起こらないようにする方法を探しています。eval
$1
ls
また、これが可能かどうか疑問に思います。 ;)
答え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 2
「find
深さ1」(つまり、現在のディレクトリ)のどれとも一致しません。
最後のタスクはデフォルトで要求されたタスクを実行します。grep
現在のディレクトリのすべてのサブディレクトリで効果的に実行されます。