Mac OSXのプレビューアプリケーションに特定のウィンドウを閉じるように指示するApplescriptベースのシェルコマンドを作成しようとしています。
#!/bin/sh
osascript <<EOF
tell application "Preview"
close "$1"
end tell
EOF
しかし、これは機能しません:エラーメッセージが表示されます
25:52: execution error: Preview got an error: "musixdoc.pdf" doesn’t understand the close message. (-1708)
関連質問: 。bash_profileで定義されたエイリアスを使用してコマンドラインからOS Xアプリケーションを閉じるにはどうすればよいですか?
デフォルトでは、プレビューに必要な辞書がないため、AppleScriptingプレビューは機能しません。これを修正するには、 Lauriの回答はこちら を確認してください。これは、Preview.appのNSAppleScriptEnabled
の設定について説明しています。
Preview.appを終了し、ターミナルを開いて次のように入力します。
_Sudo defaults write /Applications/Preview.app/Contents/Info NSAppleScriptEnabled -bool true
Sudo chmod 644 /Applications/Preview.app/Contents/Info.plist
Sudo codesign -f -s - /Applications/Preview.app
_
名前付きアプリケーションのウィンドウを閉じるコマンドは、次のようになります。
_tell application "Preview" to close window 1
_
…または名前付きドキュメントウィンドウを閉じたい場合、例: _foo.jpg
_:
アプリケーションに「プレビュー」を閉じるように指示します(名前が「foo.jpg")
したがって、シェルスクリプトでは次のようになります。
_#!/bin/sh
osascript <<EOF
tell application "Preview"
close (every window whose name is "$1")
end tell
EOF
_
ここで、スクリプトに渡される最初の引数は、閉じたいウィンドウの名前です。 _./quit.sh foo.jpg
_。ファイルにスペースが含まれている場合は、ファイル名を引用符で囲む必要があることに注意してください。 _./quit.sh "foo bar.jpg"
_。
または、任意のアプリケーションから任意のウィンドウを閉じたい場合は、次を使用します。
_#!/bin/sh
osascript <<EOF
tell application "$1"
close (every window whose name is "$2")
end tell
EOF
_
ここでは、たとえば_./quit.sh Preview foo.jpg
_を使用します。
特定のドキュメントに属するウィンドウを閉じたいが、ファイル名を指定する場合は、別のものが必要です。これは、マルチページPDFがfoo.pdf (Page 1 of 42)
として表示される可能性があるが、_foo.pdf
_をAppleScriptに渡したいだけだからです。
ここでは、ウィンドウを繰り返し処理し、ファイル名をスクリプトに渡された引数と比較します。
_osascript <<EOF
tell application "Preview"
set windowCount to number of windows
repeat with x from 1 to windowCount
set docName to (name of document of window x)
if (docName is equal to "$1") then
close window x
end if
end repeat
end tell
EOF
_
これで、_./quit.sh foo.pdf
_を呼び出すだけで済みます。一般化された方法では、名前付きドキュメントウィンドウを備えたすべてのアプリでは、次のようになります。
_osascript <<EOF
tell application "$1"
set windowCount to number of windows
repeat with x from 1 to windowCount
set docName to (name of document of window x)
if (docName is equal to "$2") then
close window x
end if
end repeat
end tell
EOF
_
Preview.appは、最後のドキュメントウィンドウが閉じられると自動的に終了するこれらのアプリケーションの1つです。これは、メモリを節約して「クリーンアップ」するために行われます。この動作を無効にするには、次を実行します。
_defaults write -g NSDisableAutomaticTermination -bool TRUE
_
もちろん、これを元に戻すには、TRUE
をFALSE
に変更します。
最後に、シェルで常に使用できる関数にスクリプトを配置することをお勧めします。これを行うには、スクリプトを_~/.bash_profile
_に追加します。このファイルが存在しない場合は作成してください。
_cw() {
osascript <<EOF
tell application "$1"
set windowCount to number of windows
repeat with x from 1 to windowCount
set docName to (name of document of window x)
if (docName is equal to "$2") then
close window x
end if
end repeat
end tell
EOF
}
_
Bashプロファイルを保存してシェルを再起動すると、どこからでも_cw Preview foo.pdf
_を呼び出すことができます。
Slhckの答えはよく、完全に見えます。 番目のコード行を実行することに注意してください:
Sudo codesign -f -s - /Applications/Preview.app
'は、次のように起動するたびにプレビューがクラッシュしたようです。
Application Specific Information:
XPC domain creation failed: The code signature is not valid: The operation couldn’t be completed. (OSStatus error -67061.)
コードサインマニュアルによると、その-f
は、 'コード署名を置き換えて既存の署名'と-s
は、「指定されたパスでコードに署名する」ことです。この場合は-
どうやら、プレビューは正しく署名されておらず、使用できなくなっています。 :(