एक तार में एक स्ट्रिंग डालकर एक कमांड का निर्माण करें


15

मैं ऐसा करने में कामयाब रहा

इको-एन " कमांड "> / देव / tty1

पत्र दिखाई देते हैं, और कर्सर चलता है, लेकिन वे "भूत" हैं - यदि आप हिट करते हैं Enter, तो कुछ भी नहीं होता है (वे स्टडिन में नहीं हैं)।

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

नीचे दिए गए स्क्रीनशॉट के बीच में, आप देखते हैं कि मैं इसका उपयोग क्यों देखता हूं। (लाल कैप्शन के साथ लाइन, पीले रंग के कैप्शन के साथ लाइन के ठीक नीचे।) जैसा कि यह अब है, आप नोट पाठ को वास्तव में "संपादित" नहीं कर रहे हैं; आपको बस एक नया पाठ लिखने के लिए कहा जाता है, जो आपके द्वारा नोट किए गए नोट के पाठ को प्रतिस्थापित कर देगा (वास्तव में नहीं)। इस प्रकार, मुझे लगा कि पुराने पाठ को टटी में चिपकाने से इसका निवारण हो सकता है: यदि उपयोगकर्ता हिट करता है, तो कोई संशोधन नहीं किया जाता है। (यह कार्यक्रम पर्ल / MySQL में है, लेकिन मुझे लगा कि "पर्ल में मैं यह कैसे करूं" की तुलना में सामान्य समाधान के लिए पूछना अधिक दिलचस्प होगा।)

उदाहरण

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

यहाँ Perl कोड है, जो नीचे C कोड का उपयोग करता है (ठीक उसी तरह काम करता है), साथ ही एक नया स्क्रीनशॉट - उम्मीद है कि यह संदेह से परे चीजों को स्पष्ट करेगा :) फिर, स्क्रीनशॉट के बीच में देखें, जहां संपादन किया गया है नोट पाठ के लिए - इस समय के आसपास, पुराना पाठ है, उदाहरण के लिए यदि आप केवल एक टाइपो को ठीक करना चाहते हैं, तो आपको पूरे नोट पाठ को फिर से लिखना नहीं होगा।

my $edit_note_text = $edit_note_data[2];
print BOLD, RED, " new text: ", RESET;
system("writevt /dev/tty \"$edit_note_text\"");
my $new_text = <$in>;
$new_text = fix_input($new_text);
my $set_text = "UPDATE notes SET note = \"$new_text\" WHERE id = $edit_note_id";
$db->do($set_text);

better_example


यदि आप रुचि रखते हैं तो मैंने स्टैक ओवरफ्लो पर अजगर में ऐसा किया। stackoverflow.com/a/29616465/117471
ब्रूनो ब्रोंस्की

आपका समस्या कथन स्पष्ट नहीं है। समस्या क्या है?

जवाबों:


3

मुझे बस एक छोटा सा सी प्रोग्राम मिला, जिसे writevtट्रिक कहा जाता है। यहां स्रोत कोड को पकड़ो । इसे gccकेवल निम्नलिखित पंक्तियों को पहले संकलित करने के लिए संकलित करने के लिए :

#include <lct/cline.h>
#include <lct/utils.h>

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

उपयोग:

sudo writevt /dev/ttyN command 

ध्यान दें, किसी कारण से, आपको रिटर्न भेजने के लिए '\r'(या '\x0D') के बजाय '\n'(या '\x0A') का उपयोग करना होगा।


यह काम करता है, लेकिन सिर्फ उन लोगों की तुलना में अधिक गलत तरीका है। मैं उपयोग समारोह खाई करने के लिए किया था, एक बनाने prognameऔर _में, और टिप्पणी बाहर कुछ फ़ंक्शन कॉलmain()
माइकल Mrozek

@MichaelMrozek _()फ़ंक्शन आमतौर पर उपयोग किए जा रहे गेटटेक्स्ट का संकेत है । डेमो कोड के इस तरह के एक साधारण टुकड़े के लिए थोड़ा अधिक लगता है, लेकिन मुझे लगता है कि चोट नहीं करता है।
jw013

लिंक ऊपर जवाब में टूट गया है। मुझे writevt.c यहां एक और मिला (github.com/  grawity पर ) ; यह अनिवार्य रूप से एक ही कार्यक्रम प्रतीत होता है।
जी-मैन ने

मेरे लिए काम नहीं करता है - केवल कमांड प्रिंट करता है। जो कुछ भी reasson के लिए Dending \ r या \ N prinst आर.एन. resperctively; /
Antoniossss

10

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

टर्मिनल में इनपुट को मजबूर करने का कोई सामान्य तरीका नहीं है। ऐसा करने की शायद ही कोई जरूरत हो। यदि आपको किसी ऐसे प्रोग्राम के साथ बातचीत करने की आवश्यकता है, जिसके लिए एक टर्मिनल की आवश्यकता होती है, तो एक समर्पित टर्मिनल एमुलेटर जैसे कि एक्सपेक्ट या एम्प्टी , या स्क्रीन या टमक्स जैसे प्रोग्रामेबल टर्मिनल रैपर का उपयोग करें । आप एक ioctl के साथ लिनक्स कंसोल में इनपुट को बाध्य कर सकते हैं । आप X11 टर्मिनल एमुलेटर में इनपुट को बल दे सकते हैं जैसे कि xdotool या xmacro


मेरी पोस्ट पर एक संपादन किया। एक नज़र रखना और आप मेरी सोच देखेंगे।
इमानुएल बर्ग

@EmanuelBerg आपका संपादन समझना कठिन है। क्या आप प्रोग्राम को प्रोग्राम में इनपुट फीड करने की कोशिश कर रहे हैं जिसे आप इंटरएक्टिवली भी इस्तेमाल कर रहे हैं? यदि यह तुम क्या चाहते हो, में कार्यक्रम चलाने screenया tmuxऔर उनके उपयोग करें stuff(स्क्रीन) या send-key(tmux) आदेश या उनके पेस्ट बफर सुविधा।
गिल्स एसओ- बुराई को रोकना '

पर्ल कोड के साथ एक दूसरा संपादन किया गया - सी बाइनरी का आह्वान है। मुझे नहीं पता ... क्योंकि यह इतना सरल था (कोड की सिर्फ एक पंक्ति) - क्या यह वास्तव में आपके तरीके ( screenया tmuxउपकरण के साथ) करना बेहतर है ?
इमानुएल बर्ग

@EmanuelBerg तो हाँ, आप के लिए देख रहे हैं screen -X stuff 'note version one'
गिल्स एसओ- बुराई को रोकना '

7

कम से कम लिनक्स और बीएसडी के पास TIOCSTI ioctl है जो वर्णों को टर्मिनल इनपुट बफर पर वापस धकेलते हैं (एक सीमा तक (लिनक्स पर 4096 वर्ण)):

#include <sys/ioctl.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>

void stackchar(char c)
{
  if (ioctl(0, TIOCSTI, &c) < 0) {
    perror("ioctl");
    exit(1);
  }
}
int main(int argc, char *argv[])
{
  int i, j;
  char c;

  for (i = 1; i < argc; i++) {
    if (i > 1) stackchar(' ');
    for (j=0; (c = argv[i][j]); j++) {
      stackchar(c);
    }
  }
  exit(0);
}

इसे संकलित करें, और इसे कॉल करें:

cmd foo bar < "$some_tty"

कुछ ट्टी पर पात्रों को पीछे धकेलने के लिए।

और पर्ल में:

require "sys/ioctl.ph";
ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV;

संपादित करें : मुझे पता है कि यह राइटवाइट समाधान के समान ही ioctl है । टिप्पणी और कमांड का नाम भ्रामक है क्योंकि TIOCSTI किसी भी टर्मिनल के लिए काम करता है, न कि केवल VT।


प्रश्न के लिए मेरा दूसरा संपादन देखें। मैंने पहले ही @htor से प्राप्त कोड संकलित कर लिया है - जो मैं देख सकता हूं, यह बहुत अच्छा काम करता है। क्या आप इस कोड का उपयोग करने के बजाय कोई लाभ देख सकते हैं? (लेकिन किसी भी मामले में आपके प्रयास के लिए धन्यवाद।)
इमानुएल बर्ग

हाँ। मेरा हालिया संपादन देखें। बिंदु TIOCSTI ioctl का उपयोग करना है। मैंने जो कोड दिया है वह फ़ाइल डिस्क्रिप्टर 0 (स्टडिन) पर है।
स्टीफन चेज़लस

सभी के पास TIOCSTI नहीं है। इस उत्तर के लिखे जाने के पांच साल बाद, लोगों ने इसे गुठली से गिराना शुरू कर दिया। unix.stackexchange.com/q/406690/5132
JdeBP

3

मेरे पास स्टैक ओवरफ्लो पर अधिक पूर्ण डेमो है

अजगर में आप कर सकते हैं:

import fcntl
import sys
import termios

with open('/dev/tty1', 'w') as fd:
    for char in "ls -la\n":
        fcntl.ioctl(fd, termios.TIOCSTI, char)

ओपी द्वारा निर्दिष्ट ट्टी मार्ग का एक सरल "command"मान ls -laऔर उपयोग करना।

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