किसी भी नए पाइप या फ़ाइल को बनाने के बिना एक टर्मिनल से दूसरे में आउटपुट कैसे भेजें


26

मैं बस अपने टर्मिनल (गनोम टर्मिनल) पर बेवकूफ बना रहा हूं। मैं सोच रहा था कि एक नई फ़ाइल या पाइप बनाने के लिए बिना एक टर्मिनल के दूसरे में आउटपुट भेजने का एक तरीका है।

उदाहरण के लिए: पहले टर्मिनल पर मैं दौड़ता हूं lsऔर चाहता हूं कि इसका उत्पादन दूसरे टर्मिनल पर प्रदर्शित किया जाए (दूसरे पर किसी भी कमांड का उपयोग किए बिना)


तुम्हारे पास क्या है? क्या आपने कुछ कोशिश की? क्या आप कुछ उदाहरण दे सकते हैं?
tachomi 14

पहले टर्मिनल पर @tachomi मैं दौड़ता हूं lsऔर चाहता हूं कि इसका आउटपुट दूसरे टर्मिनल (दूसरे पर किसी भी कमांड का उपयोग किए बिना) के साथ प्रदर्शित किया जाए
एडवर्ड टॉर्वाल्ड्स

जवाबों:


30

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

तो आप आउटपुट का उपयोग कर सकते हैं w, जिसमें TTY जानकारी शामिल है, और सीधे उस डिवाइस पर लिखें।

ls > /dev/pts/7

(यदि डिवाइस द्वारा उल्लिखित wpts / 7 था)

एक अन्य विकल्प उस प्रक्रिया की संख्या का उपयोग करना है जो उस उपकरण से जुड़ा है। अपना आउटपुट भेजें /proc/<process number>/fd/1

ls > /proc/5555/fd/1

आपको उस टर्मिनल में चलने वाली प्रक्रिया संख्या मानकर 5555 है।

ध्यान दें कि यह सीधा लिखने की अनुमति केवल तभी है जब उपयोगकर्ता जो लिखने का प्रयास करता है वह वही उपयोगकर्ता है जो दूसरे टर्मिनल का मालिक है


मुझे कमांड के /dev/pts/7साथ नहीं मिलता है या समान है w, लेकिन दूसरा तरीका मेरे लिए काम करता है
एडवर्ड टॉर्वाड्स

2
@edwardtorvalds /proc/XXX/fd/1आमतौर पर आधार डिवाइस के लिए एक नरम लिंक है। उपयोग करने का प्रयास करें ls -l /proc/XXXX/fd/1और देखें कि यह किस ओर इशारा कर रहा है। क्या इसका कोई संबंध है जो wकमांड में दिखाई देता है ?
रियलसेप्टिक

मैं संबंधित नहीं कर रहा हूँ wकमांड के साथ /proc/XXX/fd/0मैं संबंधित कर रहा हूँ wके साथ आदेश/dev/pts/7
एडवर्ड टोर्वाल्ड

4
@edwardtorvalds मैं कह रहा हूं कि वे /proc/XXX/fd/1जिस भी डिवाइस को wकमांड को प्रदर्शित करते हैं, उसके लिए एक सॉफ्ट लिंक माना जाता है। उस पर आउटपुट क्या है ls -l?
रियल सेप्टिक

TTY जानकारी आउटपुट से tty(केवल वर्तमान) या who(सभी) में भी मिल सकती है।
निक वोल्किन

14

आप writeकमांड का उपयोग कर सकते हैं ।

जैसा कि @MelBurslan ने टिप्पणी की, यदि अनुमति लिखना बंद है, तो पहले निष्पादित करें:

 $ mesg y

से man mesg

विकल्प

y अपने टर्मिनल पर लिखने की अनुमति दें।

लिखने का उपयोग:

$ write username tty

उदाहरण के lsलिए अन्य टर्मिनल पर आउटपुट भेजें ।

$ w
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user     :0       :0               08:15   ?xdm?   7:37   0.25s init --user
user     pts/0    :0               08:19    1.00s  0.09s  0.01s w
user     pts/12   :0               08:50   54.00s  0.03s  0.03s bash

$ ls | write username pts/12

मेहराब टर्मिनल पर, आर्क टर्मिनल पर, wकमांड का आउटपुट है edward tty2 19:53 6:05 2:48 23.12s firefoxऔर अगर मैं लिखता ls | write edward tty2हूं तो मुझे कोई आउटपुट नहीं मिलता है लेकिन एक बीप साउंड मिलता है
एडवर्ड टॉर्वाड्स

@edwardtorvalds आपने जारी किया edwarddइसके बजाय आपने टाइप किया edward?
15

अगर मैं इसे tty5 पर आज़माता हूं (ctrl + alt + 5) तो मुझे त्रुटि मिलती हैyou have turned write permission off
एडवर्ड टॉर्वाड्स

इस साइट पर त्रुटि टाइप कर रहा था
एडवर्ड टोरवेल्स

mesg yटार्गेट टर्मिनल पर कमांड की कोशिश करें , इससे पहले कि आप कमांड को
चलाएं

7

मुझे एक ऐसा ही तरीका मिला।

पहले टर्मिनल पर :

 $ tty
 /dev/pts/0
 $ <no need to run any command here, just see the output>

दूसरे टर्मिनल पर :

$ ls > /dev/pts/0

अब आपको पहले टर्मिनल पर आउटपुट मिलता है


1
tail -fइसके बजाय catउपयोगी हो सकता है
tachomi

3
@tachomi वास्तव में आउटपुट को पढ़ने के लिए किसी भी कमांड की आवश्यकता नहीं है
एडवर्ड टॉर्वाल्ड्स

4

ttyउन्हें पहचानने के लिए प्रत्येक टर्मिनल में कमांड का उपयोग करें:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

इन TTYs को मानते हुए, पहले के स्टडआउट को दूसरे पर पुनर्निर्देशित करने के लिए, इसे पहले टर्मिनल में चलाएं:

exec 1>/dev/pts/1

नोट: अब हर कमांड आउटपुट pts / 1 पर दिखाई देगा

Pts / 0 के डिफ़ॉल्ट व्यवहार को रोकने के लिए:

exec 1>/dev/pts/0

प्रदर्शन के लिए यह वीडियो देखें ।


यह उत्तर भी अच्छा है
एडवर्ड टोरवाल्ड्स

0

आप टर्मिनल की TTY को लिख सकते हैं; उदाहरण के लिए:

टर्मिनल 1 में:

$ tty 
ttys000

टर्मिनल 2 में:

$ tty
ttys029

$ exec &> >(tee >(cat >&/dev/ttys000))
ls 

आउटपुट आपको टाइप करते हुए वास्तविक समय में दोनों टर्मिनलों में दिखाएगा।

लाइनक्स और मैकओएस पर काम करता है। /dev/{number}Linux पर macOS TTY पथ है/dev/pts/{number}


निष्पादन exec &> >(tee >(cat >&/dev/ttys000))मौजूद नहीं है, जिससे टाइप करना असंभव हो जाता है।
एडवर्ड टोरवाल्ड्स

@EdwardTorvalds पर लाइनक्स ttyकुछ इस तरह होगा/dev/pts/0
मिगुएल मोटा

हाँ, यह वही है जो मैंने आपके कोड का परीक्षण किया था
एडवर्ड टॉर्वाल्ड्स

@EdwardTorvalds क्या कमांड मौजूद नहीं है?
मिगुएल मोटा

आपकी आज्ञा exec &> >(tee >(cat >&/dev/pts/1))। कोई नियंत्रण कुंजी संयोजन (ctrl + c) काम नहीं करता है। मुझे बाहर निकलने के लिए टर्मिनल को मारना है
एडवर्ड टॉर्वाल्ड्स

-3

आप wallयह भी उपयोग कर सकते हैं :

$ wall "Message here"

आप इसका विस्तार से वर्णन कर सकते हैं। मुझे इसमें से कुछ भी समझ में नहीं आ रहा है
एडवर्ड टोरवेल्स

3
आप निश्चित रूप से ("सभी लिखना" के लिए संक्षिप्त) का उपयोग नहीं करना चाहते हैं wall, क्योंकि यह हर लॉग-इन tty सत्र में लिखता है, जिसमें से आप भेज रहे हैं। इसके बजाय, उपयोग writeकरने से एक विशिष्ट tty घोषित होने की अनुमति मिलती है।
मोंटी हार्डर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.