टर्मिनल विंडो दिखाई दिए बिना OS X पर एक शेल स्क्रिप्ट चलाएं?


23

मैं कुछ कीबोर्ड शॉर्टकट सेट करने की कोशिश कर रहा हूं जो विशिष्ट iTerm सत्र खोलते हैं, जो कि मैं BetterTouchTool और AppleScript जादू के साथ थोड़ा सा करने में सक्षम था। समस्या यह है कि OS X आपके द्वारा GUI के माध्यम से निष्पादित किसी भी शेल स्क्रिप्ट के लिए एक टर्मिनल विंडो खोलने पर जोर देता है (यानी फाइंडर से, या बेटरचॉटटूल से कीबोर्ड शॉर्टकट के रूप में)। यदि मैं स्क्रिप्ट को दूसरे टर्मिनल से सीधे चलाता हूं तो टर्मिनल विंडो दिखाई नहीं देती है।

एक वर्कअराउंड मैंने पाया कि स्क्रिप्ट को एक .app डायरेक्टरी में लपेटना था, जो कि सुपरफ्लोरस टर्मिनल विंडो की समस्या को हल करता है, लेकिन कुछ अन्य मुद्दे हैं (उदाहरण के लिए OS X प्रत्येक परिणामी iTerm विंडो को एक अलग ऐप के रूप में मानता है, मेरी झोंपड़ी को अव्यवस्थित करता है। )। (EDIT: यह व्यवहार वास्तव में मेरी स्क्रिप्ट में बग के कारण हुआ, नीचे देखें)

मैंने टर्मिनल ऐप को किसी अन्य वर्चुअल डेस्कटॉप को स्पेस सेटिंग में असाइन करने का प्रयास किया, ताकि इसे दृष्टि से बाहर ले जाया जा सके, लेकिन फिर यह स्क्रिप्ट चलाने से पहले सिर्फ उस डेस्कटॉप पर स्विच करेगा।

क्या इस व्यवहार को पूरी तरह से अक्षम करने का कोई तरीका है? मुझे पहले से ही स्क्रिप्ट समाप्त होने के बाद विंडो को बंद करने के लिए टर्मिनल वरीयताओं में सेटिंग मिली, लेकिन टर्मिनल विंडो को एक सेकंड के लिए पॉप अप करना अभी भी कष्टप्रद है।


क्षमा करें, मुझे काफी समझ नहीं है। आप उन शेल स्क्रिप्ट के साथ क्या करना चाहते हैं? क्या आप शेल स्क्रिप्ट के बावजूद iTerm को खोलना चाहते हैं? क्या आप विशेष रूप से अपने प्रश्न में "टर्मिनल" के साथ टर्मिनल के बारे में बात कर रहे हैं। क्या आप शायद एक उदाहरण पोस्ट कर सकते हैं जिसे आप चलाने की कोशिश कर रहे हैं?
slhck

मैंने एक सामान्य शेल को लॉन्च करने के लिए, कई कई सत्रों को सेटअप किया है, एक रेल कंसोल को खोलना, रेल लॉग को प्रदर्शित करना आदि। मैं विशेष रूप से iTerm का उपयोग कर रहा हूं, और जो भी मूर्खतापूर्ण कारण के लिए OS X द्वारा टर्मिनल स्वचालित रूप से खोला जाता है। लेकिन वैसे भी, मुझे बंडल दृष्टिकोण को ठीक से काम करने के लिए एक समाधान मिला (देखें संपादित प्रश्न)।
ताउपेइरा

समझा! यदि आप अपने स्वयं के प्रश्न का उत्तर दे सकते हैं (तो नीचे दिए गए बटन का उपयोग करके) और हमें बताएं कि आपने क्या किया, या आपने इस मुद्दे को कैसे हल किया। हो सकता है कि अपने प्रश्न में कुछ उदाहरण पोस्ट करें, और फिर एक संक्षिप्त उत्तर जोड़ें। इस तरह, अगर कोई आपकी पोस्ट पर ठोकर खाता है, तो वे इससे कुछ सीख सकते हैं!
slhck

वैसे मेरे पास अभी भी वास्तविक प्रश्न (अर्थात कैसे पूरी तरह से टर्मिनल से बचने के लिए, एक .app आवरण का उपयोग किए बिना) के लिए कोई जवाब नहीं है, इसलिए मैं मामले में इसे खुला छोड़ दूंगा कि कोई मुझे ज्ञान दे सकता है।
ताउपेइरा

1
मैं अभी भी असमंजस में हूँ। आप उन्हें ऑटोमेटर द्वारा बनाए गए एक .app के माध्यम से चलाना नहीं चाहते हैं?
slhck

जवाबों:


21

ऑटोमेटर खोलें , एप्लिकेशन चुनें , एक रन शैल स्क्रिप्ट क्रिया जोड़ें और अपने शेल कमांड में उद्धरणों के बीच डालें (यदि आपके पास कोई फ़ाइल है, तो आप बस इसे खींच सकते हैं और छोड़ सकते हैं)।

इसे खेलने के अलावा, अब आप इसे सहेज सकते हैं (ऐप के रूप में कहीं भी) और यहां तक कि आइकन भी सेट करें


मैंने फुल-स्क्रीन ऐप से इस तरह से एक कमांड चलाने की कोशिश की, हालांकि इसने इसे हमेशा पृष्ठभूमि में खोला। मुझे एक गैर-अवरुद्ध फैशन में शेल में कमांड को पृष्ठभूमि में रखना था, &और फिर एक ऐप्पलस्क्रिप्ट को कॉल करके ऐप को (मेरे मामले में mplayer) सामने लाया : mplayer myvideo.avi &; osascript -e 'tell application "System Events" to set frontmost of the first process whose displayed name is "mplayer" to true'
लेनार होयट

कूल हैक @mcb। लेकिन मैं क्यों नहीं मिलता। आमतौर पर हम टर्मिनल विंडो को छिपाना चाहते हैं क्योंकि यह एक और विंडो खोलेगा, जो मुख्य है। यदि आपको mplayer की पहली टर्मिनल विंडो की आवश्यकता है, तो मुझे लगता है कि यह एक और एक को नहीं खोलता है और इसलिए आप इसे पहली जगह में क्यों छिपाना चाहेंगे?
क्रेगॉक्स

मैं mplayerस्लाइड शो (स्किम में) से एक वीडियो चलाने के लिए उपयोग कर रहा हूं । एक बग है कि खिलाड़ी बैकग्राउंड में रहता है अगर स्किम फुलस्क्रीन पर सेट है, तो मुझे यकीन नहीं है, कि क्या यह बग केवल स्किम या सभी फुलस्क्रीन ऐप्स से संबंधित है, इसलिए मुझे लगा कि मैं अपना समाधान यहां पोस्ट करूंगा।
लेनार होयट

6

यहाँ लगभग कोई प्रयास नहीं ("मैप्प" नामक ऐप के लिए) एक त्वरित और गंदा उदाहरण है:

  1. एक आंशिक अनुप्रयोग पदानुक्रम बनाएं:

        mkdir -p ./myapp.app/Contents/MacOS
    
  2. सुनिश्चित करें कि आपकी स्क्रिप्ट की पहली पंक्ति में आवश्यक कार्यक्रम का पूरा रास्ता है, जैसे,

    #!/bin/bash
    
  3. अपनी शेल स्क्रिप्ट का नाम "myapp" (कोई उद्धरण नहीं, कोई विस्तार नहीं), इसे निष्पादित करने की अनुमति दें, और फिर इसे MacOS उप-निर्देशिका में डालें। इसे निष्पादित करने की अनुमति देने के लिए:

    chmod ugo+x myapp
    
  4. सामग्री उप-निर्देशिका पर जाएं और स्ट्रिंग से युक्त PkgInfo फ़ाइल बनाएं: APPL ???? [स्ट्रिंग के अंत में कोई लाइन टर्मिनेटर नहीं!] फ़ाइल बनाने के लिए बिल्ली (1) उपयोगिता का उपयोग करें:

    cat > PkgInfo
    APPL????
    

    आपके द्वारा स्ट्रिंग टाइप करने के बाद (रिटर्न हिट न करें!), दो कंट्रोल-डी दर्ज करें, जो
    बिना लाइन टर्मिनेटर वाली फाइल को बंद कर देगा और आपको शेल प्रॉम्प्ट में लौटा देगा।)

  5. खोजक से अपने नए "ऐप" पर डबल-क्लिक करें। यह बिना किसी विंडो के साथ चलेगा।


10.13.6 पर काम नहीं किया, त्रुटि संदेश कहता है "आप एप्लिकेशन को" LoginSessionTimeLimit.app "नहीं खोल सकते हैं क्योंकि यह इस प्रकार के मैक पर समर्थित नहीं है।"
डगलस हेल्ड

1
मेरे लिए मोजावे (10.14.3) में काम किया। मुझे वास्तव में यह तरीका पसंद आया। धन्यवाद।
loco.loop

10.13.6 को मेरे लिए काम किया। @ डगलस हेल्ड आपकी स्क्रिप्ट को "मैन्युअली" यानी टर्मिनल से चलाने की कोशिश करते हैं। संभवतः यह w / त्रुटि से बाहर निकलता है इसलिए यह आपके लिए काम नहीं कर रहा है ...
marekful

महान! Mojave में काम कर रहे परीक्षण 10.14.6
निकोलो मिंगोटी

4

आप प्लैटिपस की जांच कर सकते हैं , जो शेल स्क्रिप्ट और अन्य व्याख्या की गई स्क्रिप्ट से मैक ओएस एक्स एप्लिकेशन बनाता है।


3

यदि आप अल्फ्रेड जैसे फैंसी एप्लीकेशन लॉन्च करते हैं, तो यहां एक छोटा सा बदलाव है । मैं हर दिन इसका उपयोग करता हूं, और मैंने पावरपैक खरीदा है , जो आपको साइलेंट शेल स्क्रिप्ट चलाने की अनुमति देता है

यहाँ छवि विवरण दर्ज करें

ये रनिंग के दौरान टर्मिनल नहीं खोलेंगे और किसी भी कीवर्ड सीक्वेंस के लिए बाध्य हो सकते हैं। वे पैरामीटर भी शामिल कर सकते हैं, और उनके पास अतिरिक्त विकल्प हैं:

यहाँ छवि विवरण दर्ज करें

मैं कुछ छोटे स्निपेट के लिए इसका उपयोग करता हूं, और यह बहुत लचीला है।



1

यदि आप कुंजी जोड़ते हैं LSUIElementऔर इसे अपने ऐप 1में सेट Info.plistकरते हैं, तो यह डॉक में एक आइकन नहीं बनाएगा।

यहाँ Info.plistमेरा छोटा शेल स्क्रिप्ट ऐप है:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleExecutable</key>
    <string>launch</string>
    <key>CFBundleIconFile</key>
    <string>launch</string>
    <key>LSUIElement</key>
    <string>1</string>
</dict>
</plist>

धन्यवाद, लेकिन यह एक प्रभाव नहीं लगता है। मैंने यह touchसुनिश्चित करने के लिए बंडल का भी प्रयास किया कि नवीनतम संस्करण का उपयोग किया गया था। लेकिन वैसे भी, मैं वास्तव में बंडल दृष्टिकोण को पसंद नहीं करता हूं क्योंकि ऐसा लगता है कि यह हमेशा अलग ऐप इंस्टेंसेस
बनाएगा

मेरे लिए टच ने भी मदद नहीं की (मैंने एलएसयूइलमेंट को बंद करने की कोशिश की), कैशिंग के कुछ अन्य प्रकार हैं, लेकिन एप्लिकेशन को कंप्रेस करने और निकालने में मदद मिली। आपको बंडल दृष्टिकोण क्यों पसंद नहीं है? इसके अलावा आप एप्सस्क्रिप्ट का उपयोग कर सकते हैं और बस चला सकते हैं do shell script "say 'arsti'", यह टर्मिनल विंडो नहीं खोलेगा।
टिग

ठीक है, पता चलता है कि मैं सिर्फ एक बेवकूफ हूं ;-) मुझे यह जांचने का एक विश्वसनीय तरीका नहीं मिला कि क्या ऐप पहले से ऐप्पलस्क्रिप्ट के साथ चल रहा है, इसलिए मैंने एक सामान्य बैश स्क्रिप्ट का इस्तेमाल किया pgrep, जो कॉल करता है , और फिर संबंधित कोड को सीधे पास करता है osascript(AppleScript दुभाषिया)। समस्या यह है कि pgrepHomebrew से आया है, और डिफ़ॉल्ट में नहीं है $PATH। इसलिए मेरी स्क्रिप्ट ने हमेशा एक नया iTerm उदाहरण लॉन्च किया, भले ही वह पहले से ही चल रहा हो। pgrepस्क्रिप्ट में पूरा रास्ता जोड़ने के बाद बंडल एप्रोच बिल्कुल ठीक काम करने लगता है, इसलिए मुझे लगता है कि मैं इसके लिए खुश हूं; ;-)
toupeira

इस उत्तर को @JeffB से ऊपर वाले के साथ और @ tig की Info.plist के सरलीकृत संस्करण के साथ जोड़कर (मैंने चाबियाँ CFBundleExecutableऔर CFBundleIconFileकुंजियाँ हटा दीं ), मुझे यह पूरी तरह से काम करने के लिए मिला।
डेव लैंड

0

यहाँ एक सा है:

एक शेल स्क्रिप्ट को कॉल करने वाले एप्सस्क्रिप्ट को संकलित करें :)

osacompile -e 'do shell script "cd ~; echo aaa > temp.txt"' -o ~/name_of_script.scpt

osacompileसंकलन होगा 'do shell script "XXX"'applescript टुकड़ा। आपकी शेल स्क्रिप्ट XXX है।

उद्धृत करने के लिए बाहर देखें, शेल स्क्रिप्ट को ठीक से उद्धृत किया जाना है ताकि जिस शेल का आप उपयोग कर रहे हैं वह अभी भी बरकरार रहे।

लेकिन यह बिना किसी अजीब-नेस के बेटरटचटचूल से चलाया जा सकता है।


0

एक अन्य संभावित कसरत है। एक स्वचालित वर्कफ़्लो में अपने शेल स्क्रिप्ट को सुरक्षित करें। लॉन्च के साथ वर्कफ़्लो शुरू करें। कोड है:

/usr/bin/automator /path/to/the/file.workflow

यह किसी भी कार्यक्रम को लॉन्च नहीं करेगा और न ही मेनू बार में दिखाई देगा और इसके रास्ते में अधिक मौन होगा।

शेल स्क्रिप्ट को निष्पादित करने का एक और भी बेहतर तरीका लॉन्च में प्रत्यक्ष है।

/bin/bash /path/to/shellScript.command

पृष्ठभूमि में चुपचाप कमांड अल्ट्रा निष्पादित करेगा।

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