Tcsh মধ্যে stderr stdout পুনঃনির্দেশ


4

আমার বোঝার থেকে, নিম্নলিখিত পাঠানো উচিত ' test 'tcsh মধ্যে স্ট্যান্ডার্ড ত্রুটি উপর:

echo test >&2

তবে, পরিবর্তে এটি লিখেছে ' test নামে একটি ফাইল 2, এবং যখন আমি আমার ইতিহাসের সন্ধান করি, তখন আমি দেখি যে আসলে কি সম্পাদন করা হয়েছিল

echo test > & 2

আমি নিশ্চিত নই কোন স্তর ঐ স্থানগুলি সন্নিবেশ করানো হচ্ছে, কিন্তু আমি কি এটিকে থামাতে পারি? যদি না হয়, আমি অনুমান আমি সবসময় ব্যবহার করতে পারে > /dev/stderr পরিবর্তে.


echo test >&2 stderr থেকে প্রিন্ট। আমার অন্তত অন্তত।
Der Hochstapler

1
BTW, ব্যবহার করে > একটি শেল নির্দেশক হিসাবে বর্তমান প্রসঙ্গে আপনার কোড স্নিপেট মধ্যে বেশ বিভ্রান্তিকর;)
Der Hochstapler

1
আমি প্রথম পাশাপাশি bash অনুমিত কিন্তু এটি ট্যাগ tsch।
Dave Forgac

1
বিভ্রান্তির জন্য দুঃখিত, আশা করছি আমার প্রশ্ন এখন আরও স্পষ্ট। আমি এখানে bash ব্যবহার করতে পারে, আমি চাই, এটা আমার জন্য কাজ করে।
Nate Parsons

আপনি পুনঃনির্দেশ উদ্ধৃতি করতে পারে? echo test '>&2'? যে কাজ করে যদি কোন ধারণা, এবং এটি চেষ্টা করার জন্য tcsh না।
kevlar1818

উত্তর:


5

বিষয়ে csh, থেকে http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ :

এই একই লাইনগুলির পাশাপাশি, আপনি সিএসএস স্ক্রিপ্টগুলির মধ্যে ত্রুটি বার্তাগুলিকে সঠিক হিসাবে বিবেচ্য হিসাবে stderr এর বাইরে পরিচালনা করতে পারবেন না। বোর্ন শেলে আপনি বলতে পারেন:

echo "$0: cannot find $file" 1>&2

কিন্তু সিএসএ-এ, আপনি stdout-out stderr টি পুনঃনির্দেশিত করতে পারবেন না, তাই আপনি এইরকম কিছু নির্বোধ করছেন:

sh -c 'echo "$0: cannot find $file" 1>&2'

আমি কিছু দ্রুত চেষ্টা করেছিলাম tcsh, এবং সন্দেহভাজন হিসাবে এটি যে জন্য সত্য বলে মনে হচ্ছে ( tcsh সঙ্গে সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ অনুমিত হয় csh )।


আপনার প্রণয়ন প্রশ্ন মোকাবেলার: এটা কোন ব্যাপার হবে না যদি আপনি করতে পারেন tcsh "স্পেস সন্নিবেশ করান না" যেহেতু এটি যে ক্রম অনুসারে উদ্দেশ্যে ক্রম ব্যাখ্যা করবে না।


5

সম্পাদনা করুন:

আমি এই tsch ছিল না দেখতে। "ইনপুট / আউটপুট" বিভাগ দেখুন man tsch বিস্তারিত সহ বিস্তারিত জানার জন্য

ডায়াগনস্টিক আউটপুট মান সঙ্গে একটি পাইপ মাধ্যমে পরিচালিত হতে পারে   আউটপুট। শুধু ফর্ম ব্যবহার করুন & amp; বরং শুধু |

শেল বর্তমানে ছাড়াও ডায়গনিস্টিক আউটপুট পুনঃনির্দেশিত করতে পারবেন না   স্ট্যান্ডার্ড আউটপুট পুনঃনির্দেশ, কিন্তু (কমান্ড & gt; আউটপুট ফাইল) & gt; & amp; ত্রুটি ফাইল   প্রায়ই একটি গ্রহণযোগ্য workaround হয়। আউটপুট ফাইল বা ত্রুটি ফাইল   টার্মিনালে আউট পাঠানোর জন্য / dev / tty হতে পারে।


2
যে ইঙ্গিত করার জন্য ধন্যবাদ, কিন্তু আমি এটা প্রযোজ্য নিশ্চিত নই। আমি একটি প্রক্রিয়ার ডায়াগনস্টিক আউটপুট (stderr?) পুনঃনির্দেশ করতে চাই না, পরিবর্তে আমি সাধারণ আউটপুট stdout এ উপস্থিত হতে চাই।
Nate Parsons

@drhorrible: এটি মূলত একই জিনিস। আপনি কি করছেন শুরু হয় echo প্রক্রিয়া এবং stderr তার আউটপুট পুনঃনির্দেশিত। সুতরাং, stderr কার্যকরভাবে মুদ্রণ :)
Der Hochstapler

এটা কাজ বলে মনে হচ্ছে না। (echo test > out) >& err 'পরীক্ষা' নামে একটি ফাইলটিতে 'পরীক্ষা' লিখে এবং অন্তত আমার মেশিনে একটি খালি ফাইল 'ত্রুটি' তৈরি করে।
Nate Parsons

এটি পেতে একটি ভাল উপায় STDOUT এবং STDERR উভয় আউটপুট প্রেরণ একটি কমান্ড থেকে বিভক্ত, এবং ফাইল তাদের পাঠান। যাহোক , এটা করে না জোর করে কিভাবে ওপের প্রশ্নের জবাব দেবেন? STDOUT (যা ইকো আউটপুট পাঠায় যেখানে) যেতে STDERR tcsh মধ্যে।
Randall

3

ড্যানিয়েল এন্ডারসন এর সমাধানটি দুর্দান্ত এবং আপনি যে কমান্ডটি চালাতে চান সেটি sh (এবং, তাই, একটি উপশহল, যা আপনার বর্তমান শেলের পরিবেশ পরিবর্তন করতে বা পরিবর্তন করতে পারবে না) থেকে চালানো যেতে পারে সেটি ভালভাবে কাজ করবে। আপনি stdout এ stderr রূপান্তর করতে চান তবে বর্তমান শেলের মধ্যে কমান্ডটি কার্যকর করুন, আপনি স্ট্যাড-টু-স্টেডার পুনঃনির্দেশের জন্য শুধুমাত্র ব্যাশ ব্যবহার করতে পারেন:

echo "একটি ত্রুটি বার্তা" | bash -c "বিড়াল - 1> & amp; 2"


1

আমি একটি tcsh স্ক্রিপ্টে / dev / stderr তে নির্দেশনা দিয়ে কিছু পরীক্ষা করেছি। আমার উদ্দেশ্যটি স্ক্রিপ্টের ব্যবহারকারীর (সরাসরি tcsh) সক্ষম হওয়ার উদ্দেশ্যে ছিল বিভিন্ন আউটপুট স্ট্যান্ডার্ড আউটপুট এবং মান ত্রুটি। আমি যে পাওয়া যায় স্ক্রিপ্ট মত চেহারা ছিল:

echo 1abc
echo 1ABC >>& /dev/stderr
echo 2abc
echo 2ABC >>& /dev/stderr

যদি আপনি & gt; & gt; ব্যবহার করেন না, তবে পুনঃনির্দেশিত স্ক্রিপ্ট আউটপুটে, আপনি হারাবেন স্ট্যান্ডার্ড ইনপুট এবং / অথবা মান আউটপুট তথ্য কিছু। এমনকি তাই, পুনঃনির্দেশিত একটি সহজে & gt; & amp; ব্যবহার করে একটি ফাইল স্ক্রিপ্টের আউটপুট না না কাজ করে; এটা খুব স্ট্যান্ডার্ড ত্রুটির অংশ হারান (এমনকি bash উপর)। আপনি অবশ্যই ব্যবহার করা

(SCRIPT >! file.out ) >&! file.err

গঠন করা। এখানে ফাইল বা উভয় পর্দায় আউটপুট জন্য / dev / tty হতে পারে। (যদি আপনি স্ক্রিপ্ট আউটপুট পুনঃনির্দেশ না করেন তবে কোনও সমস্যা নেই।)

আপনি যদি মান ত্রুটি থেকে সরাসরি নির্দেশ করেন যে এই অদ্ভুততা কোনটি ঘটে একটি প্রোগ্রাম ভিতরে।

এছাড়াও লিনাক্সে (উবুন্টু-ম্যাট LTS 16.04, সুনির্দিষ্ট হতে) এটিও মনে রাখবেন। অবশ্যই আপনি ব্যবহারযোগ্য হতে অন্তত জন্য বিদ্যমান অন্তত / dev / stderr প্রয়োজন।

এই পোস্ট করার পরে, আমি এখনও অন্য সমস্যা খুঁজে পাওয়া যায় নি। যদি আপনি 1ABC লাইনের পরে মান ত্রুটিতে লিখিত কোনও প্রোগ্রাম করেন তবে আপনার যদি 1ABC হারিয়ে যায় একটি ফাইল সরাসরি মান ত্রুটি। ভাল খবর আমার ক্ষেত্রে, মান ত্রুটি / dev / tty যেতে অবিরত করতে হবে। ঘি। :)

সহজ পরিবর্তন, এবং / dev / stderr ব্যতীত সিস্টেমগুলির জন্য, আমি নিম্নলিখিত দুটি হেডার লাইনের মাধ্যমে এটি বাস্তবায়ন করার সিদ্ধান্ত নিয়েছি

alias stderr echo ; if (-ew /dev/stderr) alias stderr 'echo \!* >> /dev/stderr'
which echo_err > /dev/null ; if !($status) alias stderr echo_err

এটি ব্যবহারকারীকে একটি sh স্ক্রিপ্ট echo_err রাখতে দেয়,

#!/bin/sh
echo $* 1>&2

স্ট্যান্ডার্ড ত্রুটির বাগ মুক্ত মুক্ত পুনর্নির্দেশ যদি পাথ সত্যিই প্রয়োজন (এ দুই ইমেজ অ্যাক্টিভেশন খরচ)।

আরেকটি সংযোজন: উপরে আমার পোস্ট / dev / stderr থেকে পুনঃনির্দেশিত বিষয়ে বিষয় ছিল tcsh মধ্যে। কিন্তু যতদিন আমি উপাধি দিচ্ছি, হয়ত আমাকেও দিতে হবে গ্লেন রাগান এর সমাধানের জন্য এক, যা আপনি যদি মনে না করেন তবে সত্যিই খুব সুন্দর একটি ইমেজ অ্যাক্টিভেশন। নির্ধারণ করা

alias 1to2 '\!* | sh -c "cat 1>&2"'
alias 2to1 '\!* |& cat'

তারপরে আপনি যে কোনও কমান্ডের জন্য পূর্ববর্তী স্টুডিওতে 1to2 দ্বারা পুনঃনির্দেশিত করতে চান তার আগে আপনি যে কোনও কমান্ডের পূর্ববর্তী হতে পারেন। যেটি DOS সহ অন্যান্য শেলগুলিতে 1 & gt; 2 দ্বারা কমান্ডটি আগের মতো কাজ করে। এবং এটা লিনাক্সে বাগ্গী নয়। পাশাপাশি খুব 2o1 আছে, হতে পারে। :)

OOPS: উপরে 1to2 একটি ছোটখাটো ত্রুটি: যদি কমান্ডটি স্ট্যান্ডার্ড আউটপুট এবং মানক ত্রুটির উভয় ক্ষেত্রেই লেখা থাকে, তবে অর্ডারটি ভুল। কমান্ডের স্ট্যান্ডার্ড ত্রুটি স্টাফ চূড়ান্ত মান ত্রুটি ফলাফলের মধ্যে তার মান আউটপুট স্টাফ আগে শেষ হয়। সমাধান সহজ; পরিবর্তন | মধ্যে | & amp ;:

alias 1to2 '\!* |& sh -c "cat 1>&2"'

এর জন্যে দুঃখিত.

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