2009-11-06 9 views
17

मैं अपनी टीसीएसपी स्क्रिप्ट को एक संपादक लॉन्च करना चाहता हूं (उदाहरण के लिए, vi, emacs):मैं एक शैल स्क्रिप्ट से एक संपादक कैसे लॉन्च करूं?

#!/bin/tcsh 
vi my_file 

यह my_file के साथ vi शुरू होता है लेकिन पहले एक चेतावनी प्रदर्शित करता है "विम: चेतावनी: आउटपुट टर्मिनल पर नहीं है" और मेरे कीस्ट्रोक स्क्रीन पर दिखाई नहीं देते हैं। वीआई को मारने के बाद, मेरी टर्मिनल विंडो गड़बड़ हो जाती है (कोई न्यूलाइन नहीं), "रीसेट" की आवश्यकता होती है। मैंने इसी तरह के परिणामों के साथ "emacs -nw", "xemacs -nw", और पिको को आजमाया। "xemacs" काम करता है लेकिन एक अलग विंडो लॉन्च करता है। मैं एक ही टर्मिनल विंडो का पुन: उपयोग करना चाहता हूं।

क्या एक स्क्रिप्ट से एक संपादक लॉन्च करने का कोई तरीका है ताकि वह उसी टर्मिनल विंडो का पुन: उपयोग कर सके?

+0

आम तौर पर मैं वही करता हूं जो आप करते हैं और यह मेरे लिए ठीक काम करता है। लेकिन मेरा खोल बाश है। इस तरह की चीज भी sh के तहत ठीक काम करता है। क्या आप यह पता लगाने के लिए "कौन सा vi" कर सकते हैं कि वीआई के अलावा कुछ और कहा जा रहा है या नहीं? और ... आप किस तरह का ऑपरेटिंग सिस्टम वातावरण चल रहे हैं? –

+1

बैश और विम के साथ आप स्क्रिप्ट के भीतर से vi my_file कर सकते हैं। मुझे पता नहीं है कि आपको कुछ खास क्यों करना होगा। –

+0

क्या आप एक फ़ाइल या VARIABLE की सामग्री को पढ़ने के लिए विम प्राप्त करने की कोशिश कर रहे हैं? – matpie

उत्तर

16

मैंने अपने खुद के प्रश्न का उत्तर दिया!

#!/bin/tcsh 
vi my_file < `tty` > `tty` 
+3

लेकिन ... लेकिन ... लेकिन ... कहां से रीडायरेक्ट करें? यह अभी भी एक रहस्य है कि आपको ऐसा करने की आवश्यकता क्यों है। –

+0

मैं इसे विम के साथ करने की कोशिश कर रहा हूं लेकिन मुझे केवल '\' tty \ 'मिलता है: संदिग्ध रीडायरेक्ट ' –

+3

यह मेरी स्क्रिप्ट के अंदर "tty \' '" tty \ "में विस्तार कर रहा है। मैंने अभी '/ dev/tty' का उपयोग किया है, लेकिन मुझे आश्चर्य है कि पोर्टेबल कितना हो सकता है ... –

2

मैं बैश के तहत वांछित व्यवहार प्राप्त करने में सक्षम था + Cygwin + Terminator:

#!/bin/bash 
vim foo 

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

11

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

$ vi < `tty` > `tty` 

बदल जाता है

$ vi </dev/ttys000> /dev/ttys000 

तो तुम सच में अपने वर्ष STDIN/STDOUT, आप दो नई फ़ाइलें बना रहे हैं और उन्हें मानचित्रण नहीं प्रयोग कर रहे हैं में आपकी वीआई प्रक्रिया की STDIN/STDOUT।

अब, हमें बताएं कि आप इसके साथ क्या कर रहे हैं और हम आपको बताएंगे कि इस क्लेज से कैसे बचें।

+0

मैं नई फाइलें नहीं बना रहा हूं। मैं अपनी टर्मिनल डिवाइस फ़ाइल को रीडायरेक्ट कर रहा हूं (टीटी आपको बताती है कि यह कौन सी फाइल है), जो मेरी टर्मिनल विंडो से जुड़ा हुआ है और मेरी स्क्रिप्ट चलाने से पहले मौजूद है, एसटीडीआईएन/एसटीडीओटीटी के लिए। मैंने एक स्क्रिप्ट बनाई है जो "सीवीएस प्रतिबद्ध" लपेटती है और चेक-इन करने से पहले बहुत अधिक चेक (उदा।, हमारे परीक्षण सूट चलाती है) करता है। इसे कभी-कभी "गेटेड चेकइन" कहा जाता है। कारणों से मैं अंदर नहीं जाऊंगा, मैं मानक सीवीएस प्री-प्रतिबद्ध हुक का उपयोग नहीं कर सकता। मैं अनुकरण करने की कोशिश कर रहा हूं कि "सीवीएस प्रतिबद्ध" कैसे एक संपादक लॉन्च करता है जब आप कमांड लाइन पर एक प्रतिबद्ध संदेश निर्दिष्ट नहीं करते हैं। –

2

बिल्कुल। :-)

अपनी स्क्रिप्ट लिखें और इसे EDITOR पर्यावरण चर कहते हैं, जिसे आपने "emacsclient" पर सेट किया होगा। फिर Emacs शुरू करें, M-x server-start निष्पादित करें, एक खोल बफर (M-x shell) पर स्विच करें और अपनी स्क्रिप्ट निष्पादित करें। Emacsclient संपादित करने के लिए चीज को पॉप अप करेगा और C-x # एक "पूर्ण" कमांड के रूप में कार्य करेगा और आपके द्वारा चुने गए संपादन पूर्ण या निरस्त किए गए संपादन के साथ आपको अपनी स्क्रिप्ट पर वापस ले जाएगा।

आनंद लें।

संपादित करें: मेरा मतलब है कि इन दिनों Emacs मेरा टर्मिनल प्रोग्राम है। मेरे पास दर्जनों खोल बफर हैं और आउटपुट खोने के बारे में चिंता करने की ज़रूरत नहीं है और टर्मिनल आउटपुट में हेरफेर और विश्लेषण करने के लिए Emacs की सभी शक्तियों का उपयोग कर सकते हैं। और Emacs स्क्रिप्ट्स गोले में इनपुट उत्पन्न करते हैं। वास्तव में बहुत बढ़िया। उदाहरण के लिए, स्रोतों को संपादित करते समय या मेल प्रोसेसिंग करते समय या किसी भी Emacs चीज को करने के दौरान शेल बफर में टॉमकैट आउटपुट स्क्रॉल देखना बहुत सुविधाजनक है। जब एक टोमकैट स्टैक ट्रेस दिखाई देता है तो मैं इसका तुरंत जवाब दे सकता हूं।

3

अपने टर्मिनल tty को एक चर में सेट करें, और उसके बाद उस चर के माध्यम से संपादक I/o को रीडायरेक्ट करें।

अपनी स्क्रिप्ट में:

$ MYTTY=`tty` ./myscript >/tmp/log 
2

एक खोल स्क्रिप्ट में साथ 'pinfo' एक ही मुसीबत था 'जबकि' पाश:

#!/bin/sh 

ls | while read a; do vi $a < $MYTTY >$MYTTY; done 

और फिर साथ स्क्रिप्ट को निष्पादित। लाइन लिपि में इस्तेमाल किया जा सकता है, यह मौजूदा प्रक्रिया संख्या के tty खोजने के लिए 'ps' का उपयोग करता है, "$$", और भंडार है कि $ KEY_TTY में tty:

KEY_TTY=/dev/`ps | grep $$ | tr -s '[:blank:]' | cut -d " " -f 3` 

स्क्रिप्ट में बाद में, बस इनपुट के रूप में, tty-केवल proggie फोन $ KEY_TTY साथ, मेरे मामले में यह था:

pinfo -m $s $page < $KEY_TTY 

'vi' के लिए यह होगा:

vi $a < $KEY_TTY > $KEY_TTY 

लाभ यह है कि एक के रूप में स्क्रिप्ट पूरा अभी भी एसटीडीआईएन इनपुट स्वीकार कर सकता है, और 'vi' (या जो कुछ भी) ठीक काम करना चाहिए - - स्क्रिप्ट चलाने से पहले किसी भी पर्यावरण चर सेट करने के लिए याद रखने के बिना।

6

मैं कुछ ऐसा करना चाहता था। मैं एक उपनाम चाहता था जो आखिरी फाइल पर काम करेगी, और संपादन के लिए इसे vi (1) में खोलें। वैसे भी, मैं कैसे एक पठनीय उपनाम के रूप में यह करने के लिए (tcsh में) (csh क्योंकि मैं हूँ) यह पता लगाने सकता है नहीं तो मैं बस एक बदसूरत खोल स्क्रिप्ट बनाया बजाय:

#!/bin/csh 

set DIR = "~/www/TooMuchRock/shows/" 

set file = $DIR`ls -t $DIR | head -1` 
set tty = `tty` 

vi $file <$tty >$tty 

(1) Kraftwerk: बिन> जो vi vi: aliased to/usr/local/bin/vim -u ~/.exrc

संबंधित मुद्दे