একটি ফাইলে `সময়` আউটপুট লিখুন, কেন বন্ধনী প্রয়োজন?


18

timeলিখেছেন stderr, সুতরাং কেউ ধরে নিতে পারে যে 2>&1কমান্ড লাইনে যুক্ত হওয়ার সাথে এর আউটপুটটি রুট করা উচিত stdout। কিন্তু এই কাজ করে না:

test@debian:~$ cat file 
one two three four
test@debian:~$ time wc file > wc.out 2>&1

real    0m0.022s
user    0m0.000s
sys     0m0.000s
test@debian:~$ cat wc.out 
 1  4 19 file

শুধুমাত্র প্রথম বন্ধনীর সাহায্যে এটি কাজ করে:

test@debian:~$ (time wc file) > wc.out 2>&1
test@debian:~$ cat wc.out 
 1  4 19 file

real    0m0.005s
user    0m0.000s
sys     0m0.000s

এই ক্ষেত্রে কেন প্রথম বন্ধনী প্রয়োজন? কেন একটি একক আদেশ time wcহিসাবে ব্যাখ্যা করা হয় না ?


3
নোট করুন যে timeশেল কীওয়ার্ড, বা এর উপর নির্ভর করে ফলাফলগুলি পৃথক হবে /usr/bin/time। এখানে বর্ণিত সংখ্যক সেট জড়িত থাকতে পারে (শেল এবং একটি timeপ্রক্রিয়ার সাথে সংযুক্ত )। এবং আসুন ()সাব - শেলের দ্বারা নিহিতদের সম্পর্কে ভুলবেন না । ( একটি বাশ বিশেষজ্ঞের জন্য অপেক্ষা : পি)
জন ডব্লিউ এইচ স্মিথ

উত্তর:


24

ইন ksh, bashএবং zsh, timeকোনও কমান্ড নয় (অন্তর্নির্মিত বা না), এটি ভাষা forবা পছন্দ মতো একটি সংরক্ষিত শব্দ while

এটি একটি পাইপলাইন 1 সময় ব্যবহার করা হয় ।

ভিতরে:

time for i in 1 2; do cmd1 "$i"; done | cmd2 > redir

আপনার কাছে বিশেষ সিনট্যাক্স রয়েছে যা শেলটিকে সেই পাইপ লাইন চালানোর জন্য বলে:

for i in 1 2; do cmd1 "$i"; done | cmd2 > redir

এবং এর জন্য সময় পরিসংখ্যান রিপোর্ট করুন।

ভিতরে:

time cmd > output 2> error

এটা একই, আপনি করছেন সময়জ্ঞানcmd > output 2> error কমান্ড, এবং সময়জ্ঞান পরিসংখ্যান এখনো শেল এর দ্বারা stderr উপর যান।

তোমার দরকার:

{ time cmd > output 2> error; } 2> timing-output

বা:

exec 3>&2 2> timing-output
time cmd > output 2> error 3>&-
exec 2>&3 3>&-

শেলটির স্টার্ডার পুনর্নির্দেশের জন্য timing-outputটাইম কনস্ট্রাক্ট করার আগে (আবার কমান্ড নয় ) ব্যবহৃত হবে (এখানে সময়ে সময়ে cmd > output 2> error 3>&-)।

এছাড়াও, আপনি এখানে চালাতে পারেন timeএকটি কনস্ট্রাক্ট subshell তার দ্বারা stderr পুনঃনির্দেশিত হয়েছে যে:

(time cmd > output 2> error) 2> timing-output

তবে এখানে সাবশেলটি প্রয়োজনীয় নয়, আপনার যখন প্রয়োজন হবে তখনই আপনাকে পুনঃনির্দেশ করার জন্য স্টেডার দরকার time

বেশিরভাগ সিস্টেমে একটি timeকমান্ডও রয়েছে। আপনি timeকীওয়ার্ডটি অক্ষম করে সেইটিকে অনুরোধ করতে পারেন । আপনাকে যা করতে হবে তা হ'ল আক্ষরিকরূপে কেবল কীওয়ার্ড হিসাবে স্বীকৃত হয় key

'time' cmd > output 2> error-and-timing-output

কিন্তু হুঁশিয়ার বিন্যাস ভিন্ন এবং উভয়ের দ্বারা stderr হতে পারে timeএবং cmdমধ্যে মিশে গিয়ে তৈরি করা হবে error-and-timing-output

এছাড়াও, timeকমান্ডটি timeনির্মাণের বিপরীতে পাইপলাইন বা যৌগিক আদেশগুলি বা ফাংশনগুলি বা শেল বিল্টিনগুলি সময় দিতে পারে না ...

যদি এটি বিল্টিন কমান্ড হয়, তবে এটি অনুরোধ বা বিল্টিনগুলিতে সময় কাটাতে সক্ষম হতে পারে তবে এটি পুনর্নির্দেশগুলি বা পাইপলাইনগুলি বা যৌগিক আদেশগুলি সময় দিতে পারে না।


1 লক্ষ্য করুন bash(যেমন কি বিবেচনা করা যেতে পারে) আছে একটি বাগ যেখানে time (cmd) 2> file(কিন্তু time cmd | (cmd2) 2> fileউদাহরণস্বরূপ) এর সময়জ্ঞান আউটপুট পুননির্দেশনাfile


ঠিক আছে, আমি প্রায়শই আমার মাথায় চাপ দিয়ে মনে করি যে timeএটি একটি কীওয়ার্ড, শেল বিল্টিন নয়।
cuonglm

'time'লেখার চেয়ে এক্সিকিউটেবল - হ্যান্ডিয়ার /usr/bin/time(বা এমনকি command time:-)) পাওয়ার জন্য টিপটির জন্য ধন্যবাদ ।
Alexis

@ আলেক্সিসও \time
ctrl-alt-delor 21

7

কোনও কমান্ডের নাম নেই time wc, timeএবং শেলের মধ্যে wcপৃথক শব্দ রয়েছে।

এখন প্রায়শই দুটি পৃথক প্রোগ্রামের নামকরণ করা হয় time, একটি হ'ল শেল কীওয়ার্ড, অন্যটি হ'ল বহিরাগত কমান্ড । শেলগুলিতে যা timeশেল কীওয়ার্ড, আপনি টাইপ করার সময় time wc ..., শেলটি timeবাহ্যিক সময় উপযোগের পরিবর্তে তার কীওয়ার্ডটি ব্যবহার করে ।

যখন শেলটি timeকীওয়ার্ড ব্যবহার করে , তখন এটি ( নতুন ) প্রক্রিয়াটি কাঁটাচামচ করার দরকার পড়ে না , বর্তমান timeমানটি এবং মান ত্রুটি পরিবর্তন হয় না। এতে পুনঃনির্দেশ অংশ:

time wc file > wc.out 2>&1

wcশুধুমাত্র প্রভাবিত করে ।

আপনি যখন যৌগিক কমান্ড(list) ব্যবহার করবেন :

(time wc file) > wc.out 2>&1

শেলটি time wc fileএকটি সাবশেলের অভ্যন্তরে দৌড়েছিল , (time wc file)এটি একটি একক কমান্ড হিসাবে বিবেচিত হত এবং পুনঃনির্দেশ অংশটি এর স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটিকে প্রভাবিত করে, যা এখন timeএবং উভয়ই অন্তর্ভুক্ত করে wc


গ্রুপিং কমান্ডের অন্য রূপটি ব্যবহার করে নতুন প্রক্রিয়া তৈরির ব্যয় ব্যতীত আপনি একই প্রভাব তৈরি করতে পারেন {list;}:

{time wc file;} > wc.out 2>&1

আপনি যদি বাহ্যিক ব্যবহার করেন time, তবে আপনি এই সমস্যার মুখোমুখি হবেন না, কারণ এটি নতুন প্রক্রিয়াতে চালিত হয়েছিল:

/usr/bin/time wc file > wc.out 2>&1

ব্যবহার timeএবং এর মধ্যে কোন ব্যবহারিক পার্থক্য আছে /usr/bin/time? এক্সিকিউটেবলকে কি কার্যত একই বলা হচ্ছে?
হাশিম

2

কারণ timeআপনি নির্বাহ করছেন বাশ বিল্টিন। বাশ এটিকে বিশেষভাবে প্রক্রিয়া করে।

আপনি যদি সত্যিকারের timeবাইনারি ব্যবহার করেন তবে এটি আপনি যেভাবে প্রত্যাশা করেছেন ঠিক তেমনভাবে কাজ করবে:

/usr/bin/time wc file > wc.out 2>&1

যদিও এই সময়ের আউটপুটটি কিছুটা আলাদা:

 $ /usr/bin/time wc file > wc.out 
0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata1900maxresident)k
0inputs+8outputs (0major+82minor)pagefaults 0swaps

9
এটি যদি বিল্টিন হত তবে সমস্যা হবে না। সমস্যাটি হ'ল এটি ভাষার একটি কীওয়ার্ডtime cmd > outputবার cmd > outputকমান্ড, এবং time foo | barবার foo | bar
স্টাফেন চেজেলাস

1

এটি timeসময় তথ্য লিখেন না । timeকমান্ডটি শেষ হওয়ার পরে বিল্টিন শেলটি এটি লিখতে সক্ষম করে। তবে পুনর্নির্দেশ কেবল কমান্ডকেই প্রভাবিত করে।

ইন (time ...)কেস ফেরৎ পুরো subshell প্রয়োগ করা হয়।


0

কারণ সময় শেল builtin হয়, তখন তাতে লিখেছেন শেল বরং কমান্ডের দ্বারা stderr চেয়ে এর দ্বারা stderr।

প্রথম বন্ধনী ব্যবহার করে পুরো কমান্ডটিকে একটি শিশু শেলের মধ্যে বাধ্য করে যার স্ট্যাডার পুনঃনির্দেশ করা যায়।

কোঁকড়া বন্ধনী ব্যবহার করে একটি সাবসেল শুরু না করে একই ফলাফল তৈরি করে

  { time who ; } > /tmp/timwho >& /tmp/xx 

(হ্যাঁ, আপনার সেমিকোলন প্রয়োজন)

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