টিটিটিতে স্ট্রিং রেখে কমান্ডটি তৈরি করুন


15

আমি এটি করতে পরিচালিত

প্রতিধ্বনি -n " কমান্ড "> / dev / tty1

অক্ষরগুলি উপস্থিত হয়, এবং কার্সারটি সরানো হয় তবে সেগুলি "ভূত" - যদি আপনি আঘাত করেন তবে Enterকিছুই হয় না (তারা স্টিডিনে নেই)।

সম্পাদনা:

নীচের স্ক্রিনশটের মাঝখানে আপনি দেখতে পাচ্ছেন কেন আমি এর ব্যবহার দেখতে পাচ্ছি। (একটি লাল শিরোনামযুক্ত রেখা, হলুদ ক্যাপশন সহ লাইনের ঠিক নীচে)) এখনকার মতো আপনি নোটের পাঠ্যটি সত্যিই "সম্পাদনা" করছেন না; আপনাকে কেবল একটি নতুন পাঠ্য লিখতে বলা হয়েছে, যা আপনি সম্পাদনা করছেন এমন নোটের পাঠ্যটি প্রতিস্থাপন করবে। সুতরাং, আমি ভেবেছিলাম এটি টিটিটিতে কেবল পুরানো পাঠ্যটি আটকানোর মাধ্যমে প্রতিকার করা যেতে পারে: যদি ব্যবহারকারী প্রবেশ করায়, কোনও পরিবর্তন করা হয় না। (এই প্রোগ্রামটি পার্ল / মাইএসকিউএল-তে রয়েছে তবে আমি ভেবেছিলাম "পার্লে আমি কীভাবে এটি করি" এর চেয়ে সাধারণ সমাধান জিজ্ঞাসা করা আরও আকর্ষণীয় হবে।)

উদাহরণ

সম্পাদনা 2:

এখানে পার্ল কোডটি রয়েছে যা নীচের সি কোডটি ব্যবহার করে (যেমনটি ইচ্ছা মতো কাজ করে) তেমনি একটি নতুন স্ক্রিনশট - আশা করি এটি সন্দেহ ছাড়াই বিষয়গুলি পরিষ্কার করে দেবে :) আবার, স্ক্রিনশটের মাঝখানে দেখুন, যেখানে সম্পাদনাটি করা হয়েছে নোট পাঠ্যের কাছে - এই সময়ে, পুরানো পাঠ্যটি রয়েছে, উদাহরণস্বরূপ আপনি যদি কেবল একটি টাইপো ঠিক করতে চান, আপনাকে পুরো নোট পাঠ্যটি আবার টাইপ করতে হবে না।

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
ব্রুনো Bronosky

আপনার সমস্যার বিবৃতি পরিষ্কার নয়। সমস্যাটা কি?

উত্তর:


3

আমি সবেমাত্র একটি ছোট সি প্রোগ্রাম পেয়েছি writevtযা কৌতুক করে। সোর্স কোডটি এখানে ধরুন । এটির সাথে সংকলন করতে gccকেবল নীচের লাইনগুলি প্রথমে সরিয়ে দিন:

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

আপডেট । কমান্ডের অংশ এখন কনসোল-সরঞ্জাম , যদি না আপনার বন্টন ব্যবহারগুলি, এইভাবে আরো সাম্প্রতিক ব্যবস্থা উপলব্ধ kbd পরিবর্তে কনসোল-সরঞ্জাম , যে ক্ষেত্রে আপনি থেকে এটা কম্পাইল করতে পারেন উৎস (আরো অনেক কিছু সাম্প্রতিক সংস্করণ, কোন পরিবর্তন প্রয়োজন)।

ব্যবহার:

sudo writevt /dev/ttyN command 

উল্লেখ্য, কোনো কারণে, আপনি ব্যবহার করতে হবে '\r'(অথবা '\x0D'পরিবর্তে) '\n'(অথবা '\x0A') একটি ফিরতি পাঠান।


এটি কাজ করে, তবে এর মধ্যে রয়েছে এর চেয়ে আরও বেশি ভুল রয়েছে। আমাকে ব্যবহারের ফাংশনটি খনন করতে হয়েছিল, একটি করতে হয়েছিল prognameএবং _কয়েকটি ফাংশন main()
কলটিতে

@ মিশেলমরোজেক _()ফাংশনটি সাধারণত গেটেক্সটেক্স ব্যবহারের লক্ষণ । ডেমো কোডের এমন একটি সাধারণ টুকরোটির জন্য কিছুটা ওভারকিল মনে হয় তবে আমি মনে করি আঘাত করে না।
jw013

লিংক উপরে উত্তরে নষ্ট হয়ে গেছে। আমি এখানে আরেকটি খুঁজে পেয়েছি writevt.c (github.com/  gravity এ ) ; এটি মূলত একই প্রোগ্রাম হিসাবে উপস্থিত বলে মনে হচ্ছে।
জি-ম্যান বলছেন 'পুনরায় ইনস্টল করুন মনিকা'

আমার জন্য কাজ করে না - কেবল কমান্ড প্রিন্ট করে। যে কোনও পুনর্বিবেচনার জন্য erc r বা \ n প্রিন্ট আরএনকে শ্বাস-প্রশ্বাসের সাথে যুক্ত করা; /
অ্যান্টোনিওসেস

10

একটি টার্মিনাল দুটি জিনিস দ্বিগুণ করে: একটি ইনপুট ডিভাইস (যেমন একটি কীবোর্ড) এবং একটি প্রদর্শন ডিভাইস (যেমন একটি মনিটর)। আপনি যখন টার্মিনাল থেকে পড়েন, আপনি ইনপুট ডিভাইস থেকে যা আসে তা পাবেন। আপনি যখন টার্মিনালে লিখবেন তখন ডেটা প্রদর্শন ডিভাইসে চলে যায়।

টার্মিনালে জোর করে ইনপুট দেওয়ার কোনও সাধারণ উপায় নেই। এটি করার খুব কমই দরকার আছে। আপনার যদি কোনও প্রোগ্রামের সাথে টার্মিনালের প্রয়োজন হয় তবে একটি উত্সর্গীকৃত টার্মিনাল এমুলেটর যেমন প্রত্যাশা বা খালি , বা স্ক্রিন বা টিএমাক্সের মতো প্রোগ্রামযোগ্য টার্মিনাল র‌্যাপার ব্যবহার করুন । আপনি একটি আইওএসটিএল দিয়ে লিনাক্স কনসোলে ইনপুট জোর করতে পারেন । এক্সডটুল বা এক্সম্যাক্রোর মতো সরঞ্জামগুলির সাহায্যে আপনি এক্স 11 টার্মিনাল এমুলেটরটিতে ইনপুট জোর করতে পারেন ।


আমার পোস্টে একটি সম্পাদনা করেছেন। একবার দেখুন এবং আপনি আমার চিন্তাভাবনা দেখতে পাবেন।
ইমানুয়েল বার্গ

@ ইমানুয়েলবার্গ আপনার সম্পাদনা বোঝা শক্ত। আপনি কি ইন্টারেক্টিভভাবে ব্যবহার করছেন এমন কোনও প্রোগ্রামে প্রোগ্রামগতভাবে ইনপুট খাওয়ার চেষ্টা করছেন? যদি আপনি এটি চান তবে প্রোগ্রামটি চালনা করুন screenবা tmuxতাদের stuff(স্ক্রিন) বা send-key(টিএমউक्स) কমান্ড বা তাদের পেস্ট বাফার বৈশিষ্ট্যটি ব্যবহার করুন।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

পার্ল কোড অন্তর্ভুক্ত করে একটি দ্বিতীয় সম্পাদনা করেছিলেন - সি বাইনারিটির অনুরোধ রয়েছে। আমি জানি না ... যেহেতু এটি খুব সহজ ছিল (কোডের কেবল একটি লাইন) - এটি কী আপনার উপায় ( সরঞ্জাম screenবা tmuxসরঞ্জামের সাহায্যে) করা সত্যিই ভাল ?
ইমানুয়েল বার্গ

@ ইমানুয়েলবার্গ তাই হ্যাঁ, আপনি খুঁজছেন 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"

অক্ষর কিছু tty পিছনে ধাক্কা।

এবং পার্ল ইন:

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

সম্পাদনা : আমি বুঝতে পেরেছি যে এটি রাইভটি সলিউশনের মতো একই আইওএসটিএল । টিআইওসিএসটিআইটি কেবল ভিটি-র জন্য নয়, কোনও টার্মিনালের জন্য কাজ করে বলে কমান্ডের মন্তব্য এবং নামটি বিভ্রান্ত করছে।


প্রশ্নটিতে আমার দ্বিতীয় সম্পাদনাটি দেখুন। আমি @htor থেকে প্রাপ্ত কোডটি ইতিমধ্যে সংকলিত করেছি - যা আমি দেখতে পাচ্ছি তা দুর্দান্ত কাজ করে। পরিবর্তে আপনি এই কোডটি ব্যবহার করে কোনও সুবিধা দেখতে পাচ্ছেন? (তবে উভয় ক্ষেত্রে আপনার প্রচেষ্টার জন্য ধন্যবাদ।)
ইমানুয়েল বার্গ

হ্যাঁ. আমার সাম্প্রতিক সম্পাদনা দেখুন। পয়েন্টটি হল TIOCSTI আইওসিটিএল ব্যবহার করা। আমি যে কোডটি দিয়েছি তা কেবল ফাইল বর্ণনাকারী 0 (স্টিডিন) এ করে।
স্টাফেন চেজেলাস

প্রত্যেকের আর টিআইওএসটিআই নেই। এই উত্তরটি লেখার পাঁচ বছর পরে, লোকেদের এটি কার্নেল থেকে ফেলে দেওয়া শুরু করেছিল। unix.stackexchange.com/q/406690/5132
জেডিবিপি

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এবং ওপি দ্বারা নির্দিষ্ট টিটিটি পাথ ব্যবহার করছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.