সমস্ত কমান্ড থেকে আউটপুট পুনর্নির্দেশ করুন কেবল শেষ নয় file


11

আমি ইকো সহ একটি ফাইলে একটি শিরোনাম যুক্ত করতে চাই, তারপরে বাকী ফাইলটি তৈরি করতে একটি কমান্ড ব্যবহার করুন। এর অর্থ আমি দুটি পৃথক কমান্ড ব্যবহার করব।

পুনঃনির্দেশ সহ একটি ফাইলে আমি উভয় কমান্ড থেকে আউটপুট কীভাবে লিখব?

আমি চেষ্টা করেছিলাম

echo "header line" | cut -c 1-5 input_file > output_file

echo "header line"; cut -c 1-5 input_file > output_file

এটি কেবল কাট কমান্ড থেকে আউটপুট পুনঃনির্দেশ করে।

নিম্নলিখিত কমান্ডটি কাজ করে তবে আনাড়ি অনুভব করে:

echo "header line" > output_file; cut -c 1-5 input_file >> output_file

আমার সমস্যা সমাধানের চতুর উপায় কী?

উত্তর:


11

এখানে সমস্যা লিনাক্স পুনর্নির্দেশের কোনও সমস্যা নয়; বরং পাইপলাইন কীভাবে কাজ করে তা একটি মৌলিক ভুল বোঝাবুঝি। এখানে পুনঃনির্দেশ কাজ করছে না কারণ কেবল কাটাটি আসলে স্টডআউটে মুদ্রণ করছে। ইকো কমান্ডের জন্য stdout কেটে দেওয়া স্টিডিনে পাইপ করা হয়েছে (যা কোনও ফাইল নির্দিষ্ট করার পরে এই ক্ষেত্রে ব্যবহৃত হচ্ছে না)।

echo "header line" > output_file && cut -c 1-5 input_file >> output_file

আপনি যা চান তা হ'ল এবং মোটেও অপ্রয়োজনীয় নয় (আমি আপনার ;সাথে প্রতিস্থাপন করেছি &&যাতে কাটা কমান্ড কেবলমাত্র শিরোনামটি সফলভাবে লিখিত হলে কার্যকর হবে; এইভাবে যদি আপনার আউটপুট_ফাইলে তৈরি বা লেখার অনুমতি না থাকে তবে এটি কার্যকর হবে না) )।

আপনি এগুলি সব কিছুতেও করতে পারেন, যেমন।

(echo "header line"; cut -c 1-5 input_file) > output_file

তবে এটি করার কোনও সত্যিকারের উপকার নেই এবং আরও জটিল উদাহরণগুলির সাথে এটি সমস্যার কারণ হতে পারে যদি আপনি সাবস্কেলটি কীভাবে বাদ দেওয়া হয় তার সাথে পরিচিত না হন।

আপনি যদি স্টিডনের মাধ্যমে কাটতে চান তবে আপনি চেষ্টা করতে পারেন:

echo "header line" | cut -c 1-5 - input_file

(ড্যাশ স্টিডিনের জন্য একটি সাধারণ শর্টকাট)

তবে এটি স্টিডিনে কাটা অপারেশনও সম্পাদন করবে (ফলস্বরূপ "শিরোনাম" এর একটি শিরোনাম লাইন)। আপনি প্রশ্নটি থেকে এটি চান বা না চান এটি বলা শক্ত।


13

আপনি যা খুঁজছেন তা হ'ল:

{ echo "header line"; cut -c 1-5 input_file; } > output_file
  • এই শিরোনামটির কোনও পার্শ্ব প্রতিক্রিয়া নেই কারণ বর্তমান শেলটিতে কমান্ডগুলি কার্যকর করা হয়, সাবসেল নয়
  • আউটপুট_ফাইলে যাওয়া কমান্ডগুলির একটি স্পষ্ট সীমানা আছে
  • এটি স্কেল করে যেমন আপনি এটি আবার লিখতে পারেন:

{
  echo "header line"
  cut -c 1-5 input_file
  ... # insert new commands here
} > output_file

আপনি যদি ত্রুটি আউটপুট একই ফাইলটিতে যেতে চান তবে আপনি শেষ পংক্তিকে সেইভাবে পরিবর্তন করতে পারেন:

} > output_file 2>&1

টিপটি মনে করিয়ে দেওয়ার জন্য অলিভিয়ার ডুলাককে ধন্যবাদ।

আপনার স্ক্রিনে যাওয়ার জন্য যদি ব্লকের অভ্যন্তরে কিছু আউটপুট চান তবে আপনি সেই বাক্য গঠনটি ব্যবহার করতে পারেন:

{
  echo "header line"
  echo "this line doesn't go to output_file" > /dev/tty
  cut -c 1-5 input_file
} > output_file

+1: এটি পরিষ্কার এবং কোথায় পুনঃনির্দেশিত হয়েছে তা পরিষ্কারভাবে সনাক্ত করে। (ত্রুটি বার্তা সহ) সবকিছু পুনর্নির্দেশ করতে: { .... } > some_file 2>&1( "কুপোকাত করা" some_file কুপোকাত করা নয়, বরং পরিশেষে যোগ এটি পরিবর্তে, শুধু পরিবর্তন করতে হবে। >একটি মধ্যে >>: { ... } >> some_file 2>&1)
অলিভিয়ের Dulac

4

কেবল উত্তরগুলি খুঁজে বের করার জন্য নির্বাহ করা আছে।

exec > output_file
echo "header line"
cut -c 1-5 input_file

+1: স্ক্রিপ্টগুলিতে এটি ব্যবহার করা খুব সাধারণ (কমান্ড লাইনে কম, কারণ বিষয়গুলি বিভ্রান্ত হতে শুরু করে ^^)
অলিভিয়ার ডুলাক

কেউ কি এই সমাধানটি বিস্তারিতভাবে বলতে পারেন? আমি এটি কী করছে তা দেখতে পাচ্ছি তবে আমি এই প্রসঙ্গে 'এক্সিকিউটিভ' বুঝতে পারি না। এছাড়াও, আপনার স্ক্রিপ্টের বাকী অংশে যদি সাধারণ স্টডআউট প্রয়োজন হয় তবে আপনাকে আবার কিছুটা বন্ধ করতে হবে বলে মনে হচ্ছে।
জো

1
আপনি যখন কোনও কমান্ড ছাড়াই স্ক্রিপ্টে এক্সিকিউট ব্যবহার করেন, আপনি এক্সেকের উপর I / O পুনর্নির্দেশ করতে পারেন যা বর্তমান শেল এবং ভবিষ্যতের সমস্ত শিশুকে প্রভাবিত করে।
hildred

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