4

style.lessドロップされたファイルを取得し、次の LESS コマンドを実行する単純な Automator ドロップレットを作成しようとしています。

$ LESSC {DROPPED_FILE} --watch

ドロップインしたファイルの変更を監視し、出力されたファイルを自動的に更新しますstyle.css

参考までに: CSS ファイルを動的に記述するために LESS を使用しています。詳細はこちら

基本的な液滴はうまく機能します。

  1. ドロップされたファイルは変数に渡されます。この目的のために: {MY_VAR}.
  2. 次のようにシェルでシェルスクリプトを実行し/usr/bin/rubyますsystem("lessc {MY_VAR} --watch &")

これはうまく機能しますが、自動化アプリを終了するときに --watch を停止したいです。

LESS のドキュメントには、コマンド ライン シェルで CTRL-C ショートカットを押してスクリプトを中止するように記載されています。

しかし、私はターミナル ウィンドウ内にいないため (コマンドはバックグラウンドで渡されています)、スクリプトを中止する方法がわかりません。

automator.app が閉じられた後でも、style.lessファイルは引き続き変更を監視されており、それに応じて生成されたファイルはまだstyle.css書き換えられています。

したがって、基本的には、.app の終了時に中止コマンドを渡す必要があります。

別のコマンドをターミナルシェルに渡した、クリックするとアプリを閉じる簡単なポップアップを生成しました。

これは、スクリプトを停止するためのすべての試行が失敗した部分です。

CTRL-C コマンドを押すのと同じように動作するコマンド ライン機能はありますか? これをシェルに渡すにはどうすればよいですか?

4

3 に答える 3

6

コンソールで CTRL-C を押すと、これは STDIN 経由でプログラムに送信されません。Bash(またはあなたが使用するものは何でも)はCTRL-Cを特別に扱います。bash はプロセスにシグナルを送信します。CTRL-C の場合、これは SIGINT です。プログラムにシグナルを送信するには、pid である必要はありません。次に、シグナルを pid に送信できます。pid を取得するには、Ruby でプロセスを開始します。

p= IO.popen("lessc #{file} --watch")
pid= p.pid
Process.kill("INT", pid)

ruby には、何かを実行するための少なくとも 3 つの異なる方法があります。

`lessc #{file} --watch` # returns stdout after exit
system("lessc #{file} --watch") # returns the integer return value after exit
Io.popen("lessc #{file} --watch") # returns imidietly an io object, where STDIN and STDOUT can be written and read

system("lessc #{file} --watch&")これもすぐに返しますが、常に0を返します。

于 2009-10-24T11:54:07.297 に答える
2

ヒント: ^CはシェルでControl-C 実際に何をするのでしょうか?

(文字は送信されません)。

ヒントの説明: このPDF では、シグナルについて説明しています。^C についても言及されていることに注意してください。必要に応じて手動でシグナルを送信できます。

端末で ^C を押すと、通常、実行中のプログラムに SIGINT シグナルが送信されます。これらのシグナルは Ruby でも送信できます。Ruby でのプロセスの操作 (およびシグナルの送信) の詳細: http://whynotwiki.com/Ruby_/_Process_management

ハッピーコーディング。

于 2009-10-24T06:32:36.307 に答える
0

less も「q」文字を受け取ると終了すると思います。

于 2009-10-24T04:54:11.167 に答える