কীভাবে স্টিডআউটটিকে স্ক্রিনে রাখার সময় পাইপ করবেন? (এবং একটি আউটপুট ফাইল না)


234

আমি কোনও প্রোগ্রামটিকে স্ক্রিনে রাখার সময় স্ট্যান্ডার্ড আউটপুট পাইপ করতে চাই।

একটি সাধারণ উদাহরণ সহ ( echoএখানে ব্যবহার কেবল চিত্রের উদ্দেশ্যে)

$ echo 'ee' | foo
ee <- আউটপুট আমি দেখতে চাই

আমি জানি টি স্টাডিআউট ফাইল অনুলিপি করতে পারে কিন্তু আমি চাই তা নয়।
$ echo 'ee' | tee output.txt | foo

আমি চেষ্টা করেছিলাম
$ echo 'ee' | tee /dev/stdout | fooতবে টি আউটপুট /dev/stdoutপাইপ হওয়ার পরে এটি কাজ করে নাfoo


6
নোট করুন echo 'ee' | tee /dev/stderrযদিও এটি কাজ করে, সুতরাং আপনার "স্ক্রিনে" প্রয়োজনীয়তা যদি স্ট্যাডার দ্বারাও সন্তুষ্ট হয় তবে তা করবে।
এনএইচ 2

উত্তর:


344

POSIXমানকটি অনুসরণ করা যত্নবান বলে ধরে নিলে যে কোনও ইউনিক্স / লিনাক্স প্রয়োগের ক্ষেত্রে এটি সমাধান করে Here এটি কিছু ইউনিক্স পরিবেশের মতোও কাজ করে cygwin

echo 'ee' | tee /dev/tty | foo

তথ্যসূত্র: ওপেন গ্রুপ বেস স্পেসিফিকেশন ইস্যু 7 আইইইই স্ট্যান্ড 1003.1, 2013 সংস্করণ, ,10.1 :

আপনার / dev / TTY

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

গুগল কোলাব-এর মতো কিছু পরিবেশ /dev/ttyতাদের ttyকমান্ডটি ব্যবহারযোগ্য ডিভাইস ফিরিয়ে দেওয়ার সময় প্রয়োগ না করার কথা জানানো হয়েছে । এখানে একটি কার্যনির্বাহী:

tty=$(tty)
echo 'ee' | tee $tty | foo

বা একটি প্রাচীন বোর্ন শেল সহ:

tty=`tty`
echo 'ee' | tee $tty | foo

5
@static_rtti আপনি কেন আপনার মন্তব্যে বছরের পর বছর আমার উত্তরগুলি উপেক্ষা করছেন?
jlliagre

1
@ পলবিসেক্স /dev/ttyএকটি বাধ্যতামূলক ইউনিক্স ডিভাইস। আপনি কি বিএসডি কারাগারে চলছে?
jlliagre

1
@ পলবিসেক্স এটি বাস্তবায়ন বা কনফিগারেশন বাগ either / মাউন্ট মাউন্ট করা হয়? "Ls -l / dev / tty / dev / tty * / dev" কী দেখায়? দেখুন lists.freebsd.org/pipermail/freebsd-bugs/2012-November/... forums.freebsd.org/threads/...
jlliagre

1
এবং আপনি এটির teeমতো ক্যাসকেড করতে পারেন : cat some.log | tee /dev/tty | tee -a other.log | grep -i 'foo' >> foo.log1 থেকে 1) এটি কনসোলে সমস্ত পান, 2) এটি অন্য কোনও ফাইলে সংযুক্ত করুন, 3) fooকোনও আলাদা ফাইলে লাইন পান।
জেসি চিশলম

1
গুগল কোলাব নেই /dev/tty, তবে এর আউটপুট ttyব্যবহারযোগ্য।
টম হ্যালে

69

আরেকটি বিষয় চেষ্টা করে দেখুন:

echo 'ee' | tee >(foo)

>(foo)একটি হল প্রক্রিয়া প্রতিকল্পন


1
আমি যদি অন্য বারে ফু এর আউটপুটটি পাইপ করতে চাই?
জ্যাক টাং

3
@ জ্যাকটাং - আমি মনে করি যে ফলাফলের আরও পাইপিং fooপ্রক্রিয়া প্রতিস্থাপনের অংশ হতে হবে। এখানে একটি উদাহরণ রয়েছে:echo 'ee' | tee file.txt >(wc -c | tr -d ' ')
নিক চ্যামাস

1
এটি আমার জন্য ফ্রিবিএসডি-তে (না / দেব /
টিটিআই

9
@Nick Chammas, একটি স্বাভাবিক পাইপলাইন বজায় রাখার জন্য, আপনি টী বর্ণের নাম আউটপুটের অদলবদল করতে পারেন: echo 'ee' | tee >(cat) | foo | bar
ভেলাস

18

"/ Dev / stdout" এ অ্যাক্সেস কিছু সিস্টেমে অস্বীকার করা হয়েছে, তবে ব্যবহারকারীর টার্মিনালে অ্যাক্সেস "/ dev / tty" দ্বারা দেওয়া হয়েছে। "Foo" এর জন্য "wc" ব্যবহার করে উপরের উদাহরণগুলি ঠিক আছে (লিনাক্স, ওএসএক্স ইত্যাদিতে) এইভাবে কাজ করে:

% echo 'Hi' | tee /dev/tty | wc Hi 1 1 3

মিলে যাওয়া ফাইলগুলির তালিকার নীচে একটি গণনা যুক্ত করতে, আমি এই জাতীয় কিছু ব্যবহার করি:
% ls [A-J]* | tee /dev/tty | wc -l

এই সমস্ত কিছু মনে রাখবেন না এড়াতে, আমি এলিয়াসগুলি সংজ্ঞায়িত করি:
% alias t tee /dev/tty
% alias wcl wc -l

যাতে আমি সহজভাবে বলতে পারি:
% ls [A-J]* | t | wcl


পোষ্টস্ক্রিপ্ট: ছোট সেটটির জন্য, যিনি এর উচ্চারণে "টিটি" হিসাবে মন্তব্য করতে পারেন, আমি যুক্ত করতে পারি যে "টিটিটি" একবার "টেলি টাইপ" টার্মিনালের সাধারণ সংক্ষেপণ ছিল, যা হলুদ কাগজের রোল ব্যবহার করত এবং প্রায়শই গোলাকার কীগুলি ছিল আটকে পড়া.


17

চেষ্টা করুন:

$ echo 'ee' | tee /dev/stderr | foo

স্ট্যাডার ব্যবহার করা অবশ্যই একটি বিকল্প।


8

প্রথমে আপনাকে আপনার স্ক্রিনের সাথে সম্পর্কিত টার্মিনালটি বের করতে হবে (বা যে কোনও পর্দা আপনি আউটপুট প্রদর্শন করতে চান):

tty

তারপরে আপনি সেই টার্মিনালে আউটপুট টি করতে পারেন এবং আপনার ফু প্রোগ্রামের মাধ্যমে অন্য অনুলিপিটি পাইপ করতে পারেন:

echo ee | tee /dev/pty/2 | foo

1
oneliner: t = $ (tty) প্রতিধ্বনি Ee | tee $ t | foo | বার
জ্যাক টাং

5
@ জ্যাকটাং এটি সত্যই ভাল কিন্তু tঅকেজো। আপনি ব্যবহার করতে পারেন echo ee | tee $(tty) | fooতবে এটিতে এখনও একটি অকেজো কমান্ড ( tty) রয়েছে, সত্যটি /dev/ttyঠিক কাজ করে।
jlliagre
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.