フォルダーで実行したい自動化スクリプトがあります。スクリプトでフォルダー内の各ファイルを取得し、シェル コマンドを実行する必要があります。Automator は入力を stdin に渡すように設定されていますが、以下の stdin を正しく使用しているとは思えません。
for f in "$@"
do
java -Xmx1000m -jar /Users/myprog/myprog.jar $f
done
「標準入力を正しく使用していない」と言うのは正しいです。実際、あなたが提供したスクリプト スニペットから、あなたのスクリプトは、コマンド ラインでファイルを引数として取得していると想定しています... stdin をまったく使用していません!
Run Shell Script アクションの右上隅の X の下に、「入力を標準入力に渡す」と「入力を引数として渡す」という 2 つのオプションがあるドロップダウン ボックスがあります。これらのオプションは、選択したファイルをスクリプト アクションに渡す方法を決定します。オプション「引数として」が選択されている場合、スクリプトは次のテンプレートを使用する必要があります
for f in "$@"; do
# so stuff here
done
このテンプレートは、「引数として」が選択されている場合、アクション自体によって提供されます。
一方、「to stdin」オプションが選択されている場合は、スクリプトで次のタンプレートを使用する必要があります。
while read fname; do # read each line - assumes one file name per line
# do clever stuff with the filename
echo $fname # to illustrate we'll simply copy the filename to stdout
done
(bash スクリプトを知らない場合、行の # 以降はすべてコメントです)
スクリプト アクションによって提供されるテンプレートは、単純な単一のコマンドであることに注意してください。
cat
私の意見ではあまり役に立ちません。
実際にスクリプト領域にテキストを入力するまでは、「標準入力へ」と「引数として」を切り替えると、スクリプト ボックスの内容が変更されることに注意してください (これは、スクリプトがどのように見えるべきかのヒントだと思います)。 、切り替えは行われなくなります。
特殊変数$@
は、スクリプトに提供されるすべてのコマンドライン引数を表します。
ループはfor
それぞれをステップスルーし、毎回 jar ファイルを実行します。スクリプトを次のように短縮できます。
for f
do
java -Xmx1000m -jar /Users/myprog/myprog.jar "$f"
done
のデフォルトの動作for
は を使用するため$@
です。
引数にスペースが含まれている場合に備えて、java コマンドの最後にある $f を引用符で囲む必要があります。
ここで見たことに基づいて、ファインダーのコンテキストメニューを使用してファイルを右クリックして変換できる便利な「サービス」をセットアップできます。
これを設定するには:
既存のテキスト「cat」を次のコードに置き換えます。
for f in "$@"; do
/usr/bin/afconvert -f caff -d LEI16@32000 -c 1 --mix "$f"
echo "$f converted"
done
注: 上記のセットアップは、16 ビット @ 32000hz (LEI16@32000 = リトルエンディアン 16 ビット) でモノラル (-c 1 --mix) に変換されます。ターミナルで /usr/bin/afconvert -h を使用して、使用可能なすべてのオプションを表示します。
エディターの上部に 2 つのドロップダウンが表示されます。次のように設定します。
Service receives selected [Files and Folders] in [Finder.app]
シェル スクリプト エディタ領域で、次のことを確認します。
"Shell" is set to "/bin/bash"
と
"pass input" is set to "arguments"
「CAFに変換」のようなものを保存します
あなたのスクリプトは標準入力を使用していないように見えるので、あなたの質問を理解しているかどうかわかりません。$@ 特殊パラメーターは、argv で引数として渡された位置パラメーターに展開されます。この方法でシェルから直接スクリプトを呼び出した場合と同じように機能します。
$ cat >test
for f in "$@"
do
echo $f
done
$ chmod 755 test
$ ./test a b c
a
b
c
stdin から引数を取得したい場合は、次のようにすることができます。
$ cat >test2
for f in $(cat)
do
echo $f
done
$ chmod 755 test2
$ ./test2 <<EOF
> a b c
> EOF
a
b
c