কোনও আউটপুট টার্মিনালে চলে যাওয়ার কথা ভাবতে কোনও আদেশকে কীভাবে ঠাট্টা করা যায়


38

একটি আজ্ঞা দেওয়া হয়েছে যা তার আউটপুটটি টার্মিনালে যাওয়ার সময় তার আচরণ পরিবর্তন করে (যেমন রঙিন আউটপুট উত্পাদন করে), পরিবর্তিত আচরণ সংরক্ষণ করে কীভাবে সেই আউটপুটটি পাইপলাইনে পুনঃনির্দেশ করা যায়? এর জন্য অবশ্যই একটি ইউটিলিটি থাকতে হবে, যা সম্পর্কে আমি অবগত নই।

কিছু কমান্ডের মতো grep --color=alwaysআচরণের জন্য বল প্রয়োগ করার জন্য বিকল্প পতাকা রয়েছে, তবে প্রশ্নটি কীভাবে প্রোগ্রামগুলির আশেপাশে কাজ করতে হয় যা কেবলমাত্র তাদের আউটপুট ফাইল বিবরণীর পরীক্ষার উপর নির্ভর করে।

যদি এটি গুরুত্বপূর্ণ হয় তবে আমার শেলটি bashলিনাক্সে রয়েছে।


আপনাকে জানতে হবে কীভাবে কমান্ডটি তার আউটপুট ফাইলের বিবরণী পরীক্ষা করে এবং কোনও ফলাফল আউটপুট টার্মিনাল থেকে প্রদর্শিত ফলাফলের সাথে সামঞ্জস্য করে।
অ্যান্ড্রু হেনেল

উত্তর:


21

আপনি যা প্রয়োজন তা ব্যবহার করে পেতে পারেন unbuffer

unbufferএকটি tcl/ expectস্ক্রিপ্ট। আপনি চাইলে উত্সটি দেখুন। মানুষের মধ্যে CAVEATS বিভাগটিও নোট করুন।

এছাড়াও মনে রাখবেন যে এটি যেমন উপাধিগুলি কার্যকর করে না:

alias ls='ls --color=auto'

স্টাফেন চ্যাজেলাসের দ্বারা উল্লিখিত কৌশল হিসাবে যদি কেউ যুক্ত না করে:

যদি আপনি একটি alias unbuffer='unbuffer '(পূর্ববর্তী স্থানটি নোট করুন) করেন তবে এর পরে উপাধিগুলি প্রসারিত হবে unbuffer


স্বীকৃত এলিয়াসগুলির উপর নোট - এটি বিল্টিন এবং ফাংশনগুলির মতো কোনও শেল নির্মাণের সাথেও কাজ করবে না।
আমির

4
যদি আপনি একটি alias unbuffer='unbuffer '(পূর্ববর্তী স্থানটি নোট করুন) করেন তবে এর পরে উপাধিগুলি প্রসারিত হবে unbuffer
স্টাফেন চেজেলাস

unbufferএটাই! sudo apt install expect- এটা অস্পষ্ট ছিল।
লাক্স্যাক্সস

22

টুলসেটের একটি ইতিহাস

আপনি এমন ব্যক্তি হিসাবে প্রথম ব্যক্তি নন। লোক 30 বছর ধরে এই জাতীয় সরঞ্জামগুলি চাইছে। এবং এগুলি প্রায় দীর্ঘকাল ধরে রয়েছে।

এই ধরণের জিনিসটির প্রথমতম সরঞ্জামটি ছিল ড্যানিয়েল জে বার্নস্টেইনের "পিটিআই" প্যাকেজ, যা রিচ সালজ একটি "জিনসু ছুরি" হিসাবে বর্ণনা করেছিলেন, যা বার্নস্টেইন 1990 এর দশকের শেষে নেখ্যাকের (প্রতীকী) প্রতারণার উদ্দেশ্যে লিখেছিলেন। "পিটিআই" প্যাকেজের সংস্করণ 4 1992 সালে প্রকাশিত হয়েছিল comp.sources.unix(খণ্ড 25 সংখ্যা 127 থেকে 135)। এটি এখনও ওয়ার্ল্ড ওয়াইড ওয়েবে অবস্থিত। পল ভিক্সি সে সময় এটি বর্ণনা করেছিলেন:

আমি কি বলতে পারি? এটি টুকরো টুকরো করে কাটে, এটি ডিশ ধুয়ে ফেলছে, এটি কুকুরটিকে হাঁটাচ্ছে। এটি "কেবলমাত্র কাজ করে" যার অর্থ আপনি যদি দিকনির্দেশগুলি অনুসরণ করেন তবে কোনও চুল টানা বা দাঁতে দাঁত কাটা বা অন্যান্য স্ট্যান্ডার্ড পোর্টিং কার্যক্রম ছাড়াই আপনি একটি কার্যকরী প্যাকেজ পাবেন।

বার্নস্টেইন পরে এটি আপডেট করেছিলেন, কিছুটা আগে 1999-04-07 এর আগে বা তার আগে, "পাইটিজেট" প্যাকেজটি দিয়ে তিনি ঘোষণা করেছিলেন:

আমি একটি নতুন সিউডো টিটি বরাদ্দকারী, পাইটিজেট একসাথে রেখেছি। একটি আলফা সংস্করণ চালু আছে ftp://koobera.math.uic.edu/pub/software/ptyget-0.50.tar.gz। একটি পাইজেট মেলিংয়ের তালিকা রয়েছে; যোগদানের জন্য, একটি খালি বার্তা প্রেরণ করুন djb-ptyget-requ...@koobera.math.uic.edu। আমি স্ক্র্যাচ থেকে পাইটিজের ইন্টারফেস ডিজাইন করেছি। এটি পিটিআইয়ের চেয়ে অনেক বেশি মডুলার; বেসিক pty ইন্টারফেস এখন তিন টুকরা মধ্যে বিভক্ত করা হয়েছে:

  • ptyget: একটি ক্ষুদ্র, নিম্ন-স্তরের প্রোগ্রাম - প্যাকেজের একমাত্র সেটুইড প্রোগ্রাম - এটি একটি নতুন সিউডো-টিটি বরাদ্দ করে এবং এটি আপনার পছন্দসই প্রোগ্রামে পাস করে
  • ptyspawn: অন্য একটি ছোট প্রোগ্রাম যা ছদ্ম-টিটির অধীনে একটি শিশু প্রক্রিয়া চালায়, এটি প্রস্থান করার অপেক্ষা করছে এবং স্টপগুলি সন্ধান করছে
  • ptyio: আরেকটি, কেবল কিছুটা বড়, এমন প্রোগ্রাম যা ডেটা পিছনে পিছনে সরিয়ে দেয়

পুরানো জিনসু ছুরিটি ptyএখন বানান ptybandage, যা এর প্রতিশব্দ ptyget ptyio -t ptyspawn; pty -dসিউডো-টিটিসে নেটওয়ার্ক প্রোগ্রাম সংযুক্ত করার জন্য, এখন বানান বানানো হয়েছে ptyrun, যা প্রতিশব্দ ptyget ptyio ptyspawn; এবং এর nobufপ্রতিশব্দ ptyget ptyio -r ptyspawn -23x। আমি সেশন ম্যানেজমেন্ট বৈশিষ্ট্যগুলি পৃথক প্যাকেজে ভাগ করেছি।

সেই পৃথক প্যাকেজটি ছিল "সেস" প্যাকেজ।

"পাইটিগেট" ঘটনাচক্রে খুব প্রথম সংস্করণটির উদাহরণ দিয়ে উদাহরণস্বরূপ, এবং বার্সটইনের নিজস্ব প্রকাশিত "পুনরায়" বিল্ড সিস্টেমের কয়েকটি প্রকাশিত দৃষ্টান্তগুলির মধ্যে একটি not dependonস্পষ্ট অগ্রদূত হয় redo-ifchange

ব্যবহার

ptybandage

ptybandageলোকেরা সাধারণত লগইন সেশনে কী চায়। এর প্রাথমিক ব্যবহারের ক্ষেত্রে এমন প্রোগ্রাম তৈরি করা হচ্ছে যেগুলি তাদের স্ট্যান্ডার্ড ইনপুট, আউটপুট, বা ত্রুটিগুলি টার্মিনালের সাথে সংযুক্ত কিনা সেগুলি শেল পাইপলাইনে বাস্তবে থাকা সত্ত্বেও বা তাদের স্ট্যান্ডার্ড ফাইল বর্ণনাকারীদের ফাইলের জন্য পুনঃনির্দেশিত করা হয়েছে কিনা সে সম্পর্কে সংবেদনশীল।

এটি চালানোর জন্য কমান্ড লাগে (যা একটি সঠিক বহিরাগত কমান্ড হতে হয়েছে, অবশ্যই) এবং এমনভাবে এটা মনে করেন যে তার মান ইনপুট, আউটপুট, এবং ত্রুটি প্রান্তিক সংযুক্ত হয়, এর মাধ্যমে ঐ সংযোগ এটা রান ptybandageএর মূল স্ট্যান্ডার্ড ইনপুট, আউটপুট এবং ত্রুটি।

এটি কাজের নিয়ন্ত্রণ শেলগুলির অধীনে চলার সংক্ষিপ্তসারগুলির সাথে সম্পর্কিত, এটি নিশ্চিত করে যে কোনও টার্মিনাল স্টপ অক্ষর কেবল থেমে ptybandageথাকে না তবে অভ্যন্তরীণ টার্মিনালের সাথে সংযুক্ত প্রোগ্রামটি থামিয়ে দেয়।

ptyrun

ptyrunলোকেরা সাধারণত টিসিপি নেটওয়ার্ক সার্ভারগুলিতে যা চায় তা। এর প্রাথমিক ব্যবহারের ক্ষেত্রটি হ'ল রিমোট এক্সিকিউশন এনভায়রনমেন্টগুলি যা তারা নিজেরাই টার্মিনাল সেটআপ করে না, এমন প্রোগ্রাম চালায় যা কোনও টার্মিনাল নেই যখন পছন্দসইভাবে পরিচালনা করে না।

এটি কোনও জব কন্ট্রোল শেলের অধীনে চলার প্রত্যাশা করে না, এবং কমান্ডটি চালিত হলে স্টপ সিগন্যালটি পাওয়া গেলে তা কেবল পুনরায় চালু করা হবে।

উপলব্ধ টুলসেটগুলি

দ্রু নেলসন "পিটিআই" সংস্করণ 4 এবং "পাইটিজেট" উভয়ই প্রকাশ করেন।

পল জার্ক পাইগেটের একটি নির্দিষ্ট সংস্করণ প্রকাশ করে, যা অপারেটিং সিস্টেমগুলি প্রকৃতপক্ষে আর সরবরাহ করে না এমন অপারেটিং-সিস্টেম-নির্দিষ্ট সিউডো-টার্মিনাল ডিভাইস আইওটিএলএসের সাথে কাজ করার চেষ্টা করে।

নশ সোর্স প্যাকেজটি ওয়ার্কালাইক ptybandangeএবং ptyrunস্ক্রিপ্টগুলির সাথে আসে , যা লরেন্ট বেরকোটের execlineসরঞ্জাম এবং নশ প্যাকেজের নিজস্ব সিউডো-টার্মিনাল পরিচালনার কমান্ড ব্যবহার করে। নোশ সংস্করণ ১.২৩ অনুসারে এগুলি নশ-টার্মিনাল-অতিরিক্ত প্যাকেজে প্রাক প্যাকেজযুক্ত। (পূর্ববর্তী সংস্করণগুলি কেবলমাত্র উত্স থেকে নির্মিত লোকদের তাদের সরবরাহ করেছিল))

কয়েকটি উদাহরণ ব্যবহার করে

জুরজেন ওসকাম এআইএক্স ব্যবহার ptybandageকরে এখানে একটি ডকুমেন্ট থেকে একটি প্রোগ্রামে ইনপুট খাওয়ানোর জন্য যা একটি পাসওয়ার্ড প্রম্পটের জন্য স্পষ্টতা খোলে এবং এর নিয়ন্ত্রণকারী টার্মিনালটি পড়ে:

ty ptybandage dsmadmc << EOF> uit.txt
joskam
পাসওয়ার্ড
কোয়েরি সেশন
ক্যোয়ারী প্রক্রিয়া
অব্যাহতিপ্রাপ্ত
ফাইলের শেষে

অ্যান্ডি ব্র্যাডফোর্ডptyrunbgplgsh নেটওয়ার্কের মাধ্যমে ইন্টারেক্টিভ রাউটার নিয়ন্ত্রণ প্রোগ্রামকে অ্যাক্সেসযোগ্য করার জন্য ডেমোনটুলস এবং ইউসিএসপি-টিসিপি এর অধীনে ওপেনবিএসডি ব্যবহার করে মনে করছেন যে এটি কোনও টার্মিনালের সাথে কথা বলছে:

#! / বিন / SH
এক্সিকিউট 2> & 1
এক্সিকিউটিভ এনভুইডজিড রিভিউগুলি tcpserver -vDRHl0 0 23 ptyrun / usr / bin / bgplgsh

আরও পড়া


ইতিহাসের পাঠের জন্য ধন্যবাদ, তবে আপনার প্রস্তাবিত সরঞ্জামগুলি আধুনিক লিনাক্স বিতরণে উপলব্ধ নয়, সুতরাং এটি কার্যকর নয়।
আমির

4
সেখানে হাইপার-লিঙ্ক একটি গুচ্ছ এবং যেখানে টুলস সবচেয়ে স্পষ্টভাবে অনুগত উত্তর একটি সম্পূর্ণ অধ্যায় হয় পাওয়া যায়।
জেডিবিপি

1
আপনার মতামত কি expect?
সিএমসিডিগ্রাগনকাই

20

আপনি ব্যবহার করতে পারেন socat একটির সাথে আপনার প্রক্রিয়া শুরু করতে Pty সংযুক্ত, এবং একটি ফাইলে Pty অপর প্রান্তের সংযোগ করতে socat পেতে। কোন এএফএআইইউ হ'ল আপনি যা বলেছেন:

socat EXEC:"my-command",pty GOPEN:mylog.log

এই পদ্ধতিটি ফিরে আসতে isattyডেকে আনবে এবং এমন একটি প্রক্রিয়া যা কেবলমাত্র তার উপর নির্ভর করে আউটপুট নিয়ন্ত্রণ কোডগুলিতে বোকা বানানো হবে। মনে রাখবেন যে কিছু প্রক্রিয়া (উল্লেখযোগ্যভাবে ) পরিবেশের পরিবর্তনশীলের মানও পরীক্ষা করে , তাই আপনাকে এটিকে যুক্তিসঙ্গত কিছুতে সেট করার দরকার হতে পারে যেমনmy-commandtruegrepTERM"xterm"


13

কার্লসি কর্তৃক সুপার ব্যবহারকারীতে এখানে একটি দুর্দান্ত সমাধান পোস্ট করা হয়েছে :

একটি ছোট ভাগ করা লাইব্রেরি সংকলন:

echo "int isatty(int fd) { return 1; }" | gcc -O2 -fpic -shared -ldl -o isatty.so -xc -

তারপরে এই isatty(3)ওভাররাইডকে গতিশীলভাবে লোড করতে আপনার আদেশটি বলুন :

LD_PRELOAD=./isatty.so mycommand

এটি প্রতিটি কমান্ডের বাইরে কাজ করতে পারে না, এমনকি কিছুটা অপ্রত্যাশিত উপায়ে ভেঙে দিতে পারে, তবে বেশিরভাগ ক্ষেত্রে সম্ভবত এটি কাজ করে।


2
MacOS ব্যবহারকারীদের জন্য, আপনি ব্যবহার করে একই আচরণটি পেতে পারেনDYLD_INSERT_LIBRARIES=./isatty.so DYLD_FORCE_FLAT_NAMESPACE=y mycommand
ক্রিস্টোফার শ্রোবা

12

কিভাবে ব্যবহার সম্পর্কে script(1)?

উদাহরণ স্বরূপ:

script -q -c 'ls -G' out_file

রঙের কোডগুলি সংরক্ষিত রেখে lsআউটপুট out_fileসংরক্ষণ করবে।


এটি এখানে কাজ করে না। রঙগুলি কীভাবে সংরক্ষণ করা হয়? out_fileএর কোন রঙের সাহায্যে আমার কি এমন একটি সরঞ্জাম ব্যবহার করা উচিত ?
কিরা

1
ANSI রঙ পালাবার ক্রম ফাইল দেখার জন্য @Kira, আমি ব্যবহার less -R। এই ক্ষেত্রে, যদিও আমি পাইপলাইনে আউটপুটটি চালিয়ে যেতে চেয়েছিলাম, যা শেষ পর্যন্ত আমার টার্মিনালে শেষ হয়েছিল। catউদাহরণস্বরূপ ব্যবহার করে , এটি এমন কিছু ছিল script -q -c 'ls -G' /dev/null | catযা typescriptকেবলমাত্র প্রোগ্রামটির আউটপুট রেখে পুরোপুরি ফাইলটিকে দমন করে ।
আমির

একটি ফাইল তৈরি এড়ানোর জন্য, উদাহরণ -হিসাবে scriptউদাহরণস্বরূপ আউটপুট ফাইল হিসাবে একটি ড্যাশ ( ) ব্যবহার করুন:script -q -c 'ls -G' -
ফ্রাঙ্কলিন পাইট

0

@ আমিরের উত্তরের ভিত্তিতে , এখানে একটি স্ক্রিপ্ট রয়েছে যা উত্পন্ন এবং তারপরে রানটাইমের সময় পাঠাগারটি অন্তর্ভুক্ত করে:

#!/bin/bash
set -euo pipefail

function clean_up {
  trap - EXIT # Restore default handler to avoid recursion
  [[ -e "${isatty_so:-}" ]] && rm "$isatty_so"
}
# shellcheck disable=2154 ## err is referenced but not assigned
trap 'err=$?; clean_up; exit $err' EXIT HUP INT TERM

isatty_so=$(mktemp --tmpdir "$(basename "$0")".XXXXX.isatty.so)
echo "int isatty(int fd) { return 1; }" \
  | gcc -O2 -fpic -shared -ldl -o "$isatty_so" -xc -
# Allow user to SH=/bin/zsh faketty mycommand
"${SH:-$SHELL}" -c 'eval $@' - LD_PRELOAD="$isatty_so" "$@"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.