1

私はbashスクリプトを書きます:

   #!/bin/bash
    function test_echo
    {
        echo $0
        echo $1
        echo $2
        echo $#
    }
    test_echo

私は試します:

find test.sh -type f -exec test_echo '{}' \;

また

find . -type f -exec `./test.sh {}` \;

しかし、うまくいきません。

フォルダーからファイルをスキャンし (find を使用)、ファイルごとにファイルのフルパスをパラメーターとして関数 ( foo_fonction() ) を呼び出す方法が必要です。

 find . -type f -exec foo_fonction '{}' \; 

そして、 foo_fonction() にパラメーター (フルパス) を含める方法は?

4

2 に答える 2

1

Find は内部コマンドを実行できません。

ディスク上にあるコマンドだけを実行できます。

説明は簡単です: プロセスfindが開始すると、それを開始した (この場合は fork されたbash) プロセスの環境では、内部コマンドを見ることができません。

プロセスbashは $PATH を見つける環境を通過しますが、その内部は通過しません。

関数を に追加し、file.shこれを実行可能にし、$PATH にスクリプトへのパスを追加する必要があります ["." など)。pwdの場所が]bashの場所と同じ場合、これらの条件で実行します。file.sh

于 2012-11-04T14:24:14.393 に答える
0

これには 2 つの方法があります。

1: ファイル検索スクリプトの一部として関数定義を配置できます。

(これを と呼びましょうfind_stuff.sh)

#!/bin/bash

test_echo() {
    echo $0
    echo $1
    echo $2
    echo $#
}

files=$(find $(pwd) -type f)
for f in $files
do
    test_echo "$f"
done

これが何をするかの説明:

  • 実行すると、このスクリプトを実行するために新しいシェルが生成されます./find_stuff.sh
  • test_echo()最初に関数を定義し、
  • 次に、現在の作業ディレクトリの下にあるすべてのファイルを再帰的に見つけます
  • $(pwd)絶対パスである検索ディレクトリとして指定したため、返される結果findも必要に応じて絶対パスになることに注意してください。
  • 次に、これらのファイルごとに、そのファイル パスをtest_echo関数に渡します。

2: 関数定義を別の場所に置きますが、それでもfind_stuff.shスクリプトが必要です。

#!/bin/bash

files=$(find $(pwd) -type f)
for f in $files
do
    ./test.sh "$f"
done

次のようになりtest.shます。

#!/bin/bash

test_echo () {
    echo $0
    echo $1
    echo $2
    echo $#
}

test_echo $@

最後の行に注意してください。test_echo $@この$@部分は、以前に欠落していたものです。

于 2012-11-04T15:36:53.847 に答える