Ok!あなたのコメントに基づいて、私はあなたの質問を次のように書き直します:
system("echo %s")
AppleScript を実行するようにだます方法は?
私はsystem()
、C での使用に注意することがなぜ重要なのかを理解するために、 の限界を押し広げようとしています。このサンプル プログラムは、C に関する本に掲載されています。
#include <stdio.h>
#include <stdlib.h>
char* now() {
return "yyyy-mm-dd";
}
int main() {
char comment[80];
char cmd[120];
fgets(comment, 80, stdin);
sprintf(cmd, "echo '%s %s' >> reports.log", comment, now());
return system(cmd);
}
と入力することで、プログラムから「エコーアウト」し、プログラムでほとんどの bash スクリプトを実行できます' && pwd && '
。今度は、bash の代わりに AppleScript を使用して、同様のことを行う方法を見つけたいと思います。私はこれを試しています:
' && "osascript -e 'tell application "Terminal"' -e 'do script "foo bar"' -e 'end tell'" && '
コマンドはosascript ... 'end tell'
ターミナルで直接実行すると機能しますが、正しく実行されません。引用符などで多くのバリエーションを試しましたが、役に立ちませんでした。
すると、私の答えは次のようになります。
実行中のコマンドを正確にデバッグしやすくするために、コマンドを端末にエコーしましょう。
#include <stdio.h>
#include <stdlib.h>
char* now() {
return "yyyy-mm-dd";
}
int main() {
char comment[80];
char cmd[120];
fgets(comment, 80, stdin);
sprintf(cmd, "echo '%s %s' >> reports.log", comment, now());
/* for debugging */
printf("executing %s\n", cmd);
return system(cmd);
}
それでは、試してみましょう:
$ gcc -c prog.c -o prog
$ ./prog
' && osascript -e 'tell application "Terminal"' -e 'do script "date"' -e 'end tell'" && '
executing echo '' && osascript -e 'tell application "Terminal"' -e 'do script "date"' -e 'end t yyyy-mm-dd' >> reports.log
は!end t
の代わりになぜか途切れてしまったend tell'" && '
。ちょっと待って、入力バッファの大きさは?80文字?それが問題です!あなたがしようとしている AppleScript コマンドは構文的には正しいのですが、入力バッファに対して長すぎて途切れています。
すべての空白を削除し、あまり知られていない bash 機能を使用して改行を埋め込むと、その AppleScript をかろうじて 77 文字に絞り込むことができます。
'&&osascript -e$'tell application "Terminal"\ndo script "date"\nend tell'&& '
80 文字のバッファには最後にヌル ターミネータが必要なため、実際には 79 文字分のスペースしかありません。したがって、この特定の AppleScript コマンドを使用すると、端末で最大 6 文字の長さのシェル コマンドを実行できます…</p>
C から複数行の AppleScript を呼び出す方法は、元の質問だと思いましたが、私の答えは次のとおりです。
コマンドライン引数には、改行を含めることができます。次のように bash から AppleScript 全体を実行できます。
$ osascript -e '
tell application "Terminal"
do script "date"
end tell'
bash は終了を待って一時停止し、'
スクリプト全体を 1 つの引数として渡します。
もう少し引用するだけで、Cでも同様のことができます。
#include <stdio.h>
int main() {
system("osascript -e '\n"
"tell application \"Terminal\"\n"
" do script \"date\"\n"
"end tell'\n");
return 0;
}