दूरस्थ सक्रिय टर्मिनल में निष्पादित कमांड


10

मान लीजिए कि आपके पास 6350 के PID के साथ एक टर्मिनल एमुलेटर (T1) खुला है।

दूसरे टर्मिनल से, यह कमांड टाइप करें (C1):

echo "ls\n" > /proc/6350/fd/0

यह lsT1 में लिखता है और नई लाइन बनाता है लेकिन इसे निष्पादित नहीं करता है। क्यों?

मैंने इसके cat|bashसाथ प्रयोग करने की भी कोशिश की , echo "ls\n" > /proc/catid/fd/0लेकिन इसे अभी भी निष्पादित नहीं किया गया है।

मैं कमांड को दूसरे टर्मिनल में कैसे इको कर सकता हूं और कमांड को निष्पादित किया जा सकता है?

संभावित उत्तर:

$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;

इस मामले में आप अब सीधे टर्मिनल में नहीं लिख सकते हैं (सब कुछ उसी तरह प्रदर्शित होता है जिस तरह से कमांड (C1) इस टर्मिनल में प्रदर्शित होती है।



मैंने वह पढ़ा, लेकिन यह बहुत मददगार नहीं है।
rvlander

1
यह "उपयोगी" नहीं हो सकता है जैसा कि आप इसे करने का एक तरीका देते हैं, लेकिन यह आपके प्रश्न का उत्तर देता है: आप नहीं कर सकते। आप हमें अंतिम लक्ष्य बता सकते हैं जिसे आप पूरा करने का प्रयास कर रहे हैं और देखें कि क्या कोई और तरीका है।
केविन

ठीक है आप नहीं कर सकते लेकिन फिर पाठ को दूसरे टर्मिनल में क्यों प्रदर्शित किया जाता है?
rvlander

क्योंकि आप पाठ को टर्मिनल इंटरफ़ेस पर भेजते हैं, शेल में नहीं।
भीड़

जवाबों:


11

एक कमांड लाइन उपयोगिता है, जिसे ttyechoकिसी अन्य टर्मिनल (tty / pts) पर कमांड भेज सकते हैं और कमांड को निष्पादित किया जा सकता है।

sudo ttyecho -n /dev/pts/5 ls

देखें: अन्य टर्मिनलों के लिए कमांड या डेटा भेजने की उपयोगिता (tty / pts)

यह भी देखें: ttyechoGitHub पर स्रोत कोड

एक और दिलचस्प ट्टी कमांड है selector, कंसोल में एक वास्तविक समय इंटरैक्टिव पैटर्न मिलानकर्ता जो ट्टी इनपुट बफर को अपडेट करता है।

# selector examples
selector -v -x @ <(find . -maxdepth 2 -type d | awk '{print $0"@cd "$0}')
selector -v -x @ <(grep -E -o 'http[^ ]+' fileWithURLS)

देखें: चयनकर्ता - CONSOLE में डायनामिक खोज


अफसोस की बात है कि ttyechoजीथब पर स्रोत कोड का लिंक टूटा हुआ लगता है। हालाँकि, यह github.com/osospeed/ttyecho के बजाय अब उपलब्ध है, लगता है ।
विल्सन एफ

7

जब आप करने के लिए एक लिखने जारी /dev/pts/X( /proc/6350/fd/0, 1और 2है कि करने के लिए सिर्फ एक सिमलिंक है), क्या होता है बिल्कुल वही बात जब प्रक्रिया होता है कि है 6350(या इसके बच्चों में से एक, उपयुक्त रूप से काँटेदार) आउटपुट कुछ: यह टर्मिनल के लिए लिखता है।

यदि आप उस डिवाइस ( ) से पढ़ने की कोशिश करते हैंcat < /dev/pts/X , तो फंकी चीजें होंगी। आपको उन चीजों को देखना चाहिए जो आप मूल शेल शो में टाइप करते हैं। (संभवत: आपके द्वारा लिखी गई पहली नई पंक्ति के बाद ही - मैं टर्मिनल प्रोग्राम का अनुमान लगा रहा हूं ( xtermया आप जो भी उपयोग कर रहे हैं) कुछ लाइन बफरिंग करता है, और जो 6350शेल readउस टुकड़े पर अवरुद्ध हो गया था , उसके बाद या तो शेल हो सकता है, या हो सकता है; नहीं, बाद में पढ़े जीतें, लेकिन मैं इस पर पूरी तरह गलत हो सकता हूं।)

बात यह है: जब आप उस डिवाइस से पढ़ते हैं या लिखते हैं, तो आप उस अन्य शेल से बात नहीं कर रहे हैं जो इसका उपयोग कर रहा है। आप टर्मिनल एमुलेटर से बात कर रहे हैं ( xtermउदाहरण के लिए)। केवल टर्मिनल एमुलेटर उस चैनल में डेटा को इंजेक्ट कर सकता है (शेल क्या पढ़ता है), और वह सब जो शेल लिखता है टर्मिनल पर जाता है। दूसरा शेल संलग्न करने से वह परिवर्तित नहीं होता है।

यदि आप कमांड को उस 6530प्रक्रिया में इंजेक्ट करना चाहते हैं , तो यह टर्मिनल के माध्यम से करना होगा (चाहे वह एक्स 11 ऐप हो या कुछ और)।

अनुशंसित पढ़ना: 'टर्मिनल', 'शेल', 'ट्टी' और 'कंसोल' के बीच सटीक अंतर क्या है?


1
दिलचस्प है, पीटीएस से पढ़ना ( cat /dev/pts/x, आपको ज़रूरत नहीं है <) मुझे टर्मिनलों के बीच सख्ती से बारी-बारी से पत्र मिलते हैं।
केविन

पुनर्निर्देशन का उपयोग नहीं करने से शायद बहुत बदलाव नहीं होता है। मुझे नॉन-प्रेडिक्टेबल आउटपुट मिलता है।
चटाई

दिलचस्प है, लिंक के लिए धन्यवाद। तो /proc/6350/fd/0स्टडिन माता-पिता के लिए एक सिमलिंक है process 6350जो एक टर्मिनल है। मुझे लगता है कि यह विंडो वाले अनुप्रयोगों के लिए समान है?
rvlander
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.