0

AppleScript を 1 行に要約した場合、それをカプセル化してecho systemC プログラムからの呼び出しで実行するにはどうすればよいですか? 私が試したすべてのフォーマットはエラーになります: (一重引用符、二重引用符、さまざまな括弧など...)

明確でない場合のために、fgets()入力をキャプチャするために使用する C プログラムがあります。システムコマンドでエコーしようとすると、echo ' && foo bar && $? '通常は機能します。しかしecho、AppleScript に直接書き込もうとすると、書式設定がうまくいかないようです。何か案は?

FWIWここに私がしようとしているものがあります:

echo ' && "osascript -e 'tell application "Terminal"' -e 'do script "foo bar"' -e 'end tell'" && $?'

上記の例は、一重引用符内に含まれるすべてをエコーし​​て「出力」しますが、実行はしません。引用符などで多くのバリエーションを試しましたが、役に立ちませんでした。また、osascript ... 'end tell'端末で直接実行すると動作します。

どんな助けでも大歓迎です!

編集

C コードのスニペットを次に示します。

    char comment[80];
    char cmd[120];
    fgets(comment, 80, stdin);
    sprintf(cmd, "echo '%s %s' >> reports.log", comment, now());
    system(cmd);

2つ編集...タイトルをより正確に変更

4

1 に答える 1

3

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;
}
于 2013-01-25T03:10:13.757 に答える