ऐप्पलस्क्रिप्ट को बैश स्क्रिप्ट से चलाएं


55

अगर मैं एक bash स्क्रिप्ट के भीतर से AppleScript चलाना चाहता था, तो मैं कमांड्स की सूची के साथ एक फ़ाइल कॉल कर सकता था जिसे मुझे निष्पादित करने की आवश्यकता है।

#!/bin/bash
{some commands}
osascript file.scpt
{other commands}

हालाँकि, अगर मैं आदेशों को चलाना चाहता था जो कि बैश के भीतर से अनुक्रम में चलाने की आवश्यकता थी?

एक उदाहरण होगा

#!/bin/bash
echo
echo This will open Google Chrome in Kiosk mode
  osascript -e "tell application \"Google Chrome\""
  osascript -e "activate"
  osascript -e     "tell application \"System Events\""
  osascript -e         "key down {command}"
  osascript -e         "key down {shift}"
  osascript -e         "keystroke \"f\""
  osascript -e         "key up {shift}"
  osascript -e         "key up {command}"
  osascript -e     "end tell"
echo "Google Chrome is now open in Kiosk Mode"

मुझे पता है कि यह एक बहुत दूर का उदाहरण है, लेकिन यह समझाने का काम करता है कि मैं क्या करने की कोशिश कर रहा हूं। आम तौर पर, उन आदेशों को उनके संबंधित बच \पात्रों के बिना सभी जगह और कम से कम "प्रत्येक कमांड के आसपास लिखा जाएगा । मैं भी उन्हें एक .scptफ़ाइल के अंदर होगा ।

एक समाधान जिसके बारे में मैं जानता हूं, वह है कि स्क्रिप्ट #!/usr/bin/osascriptको बैश के बजाय उपयोग करके फिर से लिखना और वहां से जाना, लेकिन मैं मिश्रण करने में सक्षम होना चाहता हूं। मैंने पाया है कि मैं एक स्क्रिप्ट फ़ाइल के लिए परीक्षण कर सकता हूं, अगर यह एक बनाने के लिए मौजूद है और प्रत्येक कमांड को उस फ़ाइल में संलग्न करना है और फिर आवश्यक स्क्रिप्ट फ़ाइल को बैश के भीतर से निष्पादित करना है, लेकिन यह भी उद्देश्य को हरा देता है।

कोई रास्ता नहीं है कि एक फ़ाइल के माध्यम से मध्य-मार्ग, मैं शेल का उपयोग shebangलाइन के साथ कर सकता हूं और फिर आवश्यक कमांड को निष्पादित करने के बाद वापस स्वैप कर सकता हूं, क्या वहां है?

किसी भी अंतर्दृष्टि का स्वागत से अधिक होगा।

जवाबों:


57

तर्क osascript -eमें नए अंक शामिल हो सकते हैं:

osascript -e 'set x to "a"
say x'

आप कई -eतर्क भी निर्दिष्ट कर सकते हैं :

osascript -e 'set x to "a"' -e 'say x'

या यदि आप एक हियरडॉक उपयोग करते हैं, bash(तीन अक्षरों की व्याख्या \, $और `) के बीच <<ENDऔर ENDके बीच है, लेकिन कोई वर्ण <<'END'और END

osascript <<'END'
set x to "a"
say x
END

संपादित करें:

चूंकि ऑस्क्रिप्‍ट एक हेरेडोक के साथ काम कर सकता है (यानी / देव / स्टडिन से इनपुट लेता है) तो एक पूरी स्क्रिप्ट के रूप में स्क्रिप्ट लिख सकता है और सही शेबंग लाइन के साथ प्रीपेन्ड कर सकता है:

#!/usr/bin/env osascript

set x to "a"
say x

यह आपको निम्नलिखित प्रक्रिया (अपनी स्क्रिप्ट के नाम के लिए परिवर्तन) का उपयोग करके ~ / एप्लीकेशन / .app में एक वास्तविक कार्यक्रम के रूप में अपनी ऐप्पल स्क्रिप्ट को बचाने की अनुमति देता है:

mkdir -p ~/Applications/<APP_NAME>.app/Contents/MacOS
touch ~/Applications/<APP_NAME>.app/Contents/MacOS/<APP_NAME>
open -A TextEdit ~/Applications/<APP_NAME>.app/Contents/MacOS/<APP_NAME>

सुनिश्चित करें कि दोनों स्क्रिप्ट फ़ाइल ... / MacOS / और मैचों में


वास्तव में आप सही हैं। मुझे end tellस्क्रिप्ट की पहली याद आई।
डैनिजेल-जेम्स डब्ल्यू

किसी भी कारण से आपको -eHEREDOC उदाहरण की आवश्यकता नहीं है ?
आइकनोकॉस्ट

ऑसिस्क्रिप्ट पर मैनकॉस्टल प्रति व्यक्ति पृष्ठ यह स्क्रिप्ट की एक पंक्ति है। -e statement Enter one line of a script. If -e is given, osascript will not look for a filename in the argument list. Multiple -e options may be given to build up a multi-line script. Because most scripts use characters that are special to many shell programs (for example, AppleScript uses single and double quote marks, ``('', ``)'', and ``*''), the statement will have to be correctly quoted and escaped to get it past the shell intact.
uchuugaka

क्षमा करें @uchuugaka, लेकिन मैं यह समझने में विफल रहा हूं कि आपकी प्रतिक्रिया मेरे प्रश्न का उत्तर कैसे देती है। में -e statement Enter one line of a scriptवहाँ है एक -eवर्तमान। लेकिन इसके अलावा, क्या HEREDOC को एक एकल पंक्ति के रूप में माना जाता है?
आइकनोकॉस्ट

21

आप कच्चे AppleScript को लपेट सकते हैं <<EOD... EODइनपुट के अंतिम सिग्नल को लाइन में पहले स्थान पर आना होगा।

(बीटीडब्लू, आपकी अपील के बाद लगता है कि लापता end tellहो गया था activate...)

#!/bin/bash
osascript <<EOD
  tell application "Google Chrome"
      activate
  end tell
  tell application "System Events"
      key down {command}
      key down {shift}
      keystroke "f"
      key up {shift}
      key up {command}
  end tell
EOD

echo "Google Chrome is now open in Kiosk Mode"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.