আসল কমান্ড, এবং টার্মিনালে মুদ্রণ সহ কোনও কমান্ড থেকে কোনও ফাইলের সরাসরি আউটপুট


8

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

  • আমার যে কমান্ডটি চালাতে হবে তা চালান
  • কমান্ড থেকে সমস্ত আউটপুট একটি নির্দিষ্ট ফাইলে পুনর্নির্দেশ করুন
  • নির্দিষ্ট ফাইলটিতে মূল কমান্ড অন্তর্ভুক্ত করুন
  • টার্মিনালে আসল কমান্ড থেকে আউটপুট প্রিন্ট করুন

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

কেউ এটিকে পরামর্শ দিয়েছেন:

echo "ls -l" | xargs -I{} bash -c "echo >> output.file; eval {} >> output.file"

তবে এটি হয় টার্মিনালে আউটপুট মুদ্রণ করে না বা ফাইলটিতে মূল কমান্ড অন্তর্ভুক্ত করে না।

আমি কোন ধারণা প্রশংসা করব।



আমি আমার সন্ধানে এটি খুঁজে পাইনি - ঠিক একই নয়, তবে সম্ভবত আমাকে উত্তরের দিকে নিয়ে যেতে হবে।
শনিহ

হ্যাঁ, এবং এই কারণেই আমি প্রায় সদৃশ বলেছিলাম । তবে আমার মতের সাথে পুরোপুরি সৎ হতে, আপনি সেখান থেকে প্রায় কোনও সমাধান নিতে পারেন এবং পাইপ দিয়ে এটি ব্যবহার করতে পারেন tee
সের্গেই কোলোডিয়াজনি

উত্তর:


14

এটি teeআপনি অনুসন্ধান করছেন।

ls -l | tee outfile

ls -lstdout (অর্থাত্ টার্মিনাল) এর আউটপুট মুদ্রণ করে outfileএবং একই সাথে ফাইলটিতে এটি সংরক্ষণ করে । তবে : এটি কমান্ডের নামটি স্টাডাউট বা ফাইলেও লিখেনি। এটি অর্জন করতে, echoকমান্ড চালানোর আগে কমান্ডের নাম এবং উভয় আউটপুটগুলিতে পাইপ tee:

( echo "ls -l" && ls -l ) | tee outfile

এটি টাইপ করা জটিল, তাই কেন একটি ফাংশন সংজ্ঞায়িত করা হয় না?

both(){ ( echo "$@" && "$@" ) | tee outfile ;}

এর পরে আপনি কেবল চালাতে পারেন

both ls -l

পছন্দসই ফলাফল পেতে। ~/.bashrcপ্রতিটি নতুন টার্মিনালে এটি সংজ্ঞায়িত করতে আপনার কার্যটি রেখে দিন।

আপনি যদি প্রথম আর্গুমেন্ট হিসাবে আউটপুট ফাইল নির্দিষ্ট করতে সক্ষম হতে চান

both output ls -l

পরিবর্তে এটি তৈরি করুন:

both(){ ( echo "${@:2}" && "${@:2}" ) | tee "$1" ;}

যদি আপনি না চান যে আউটপুট ফাইলটি ওভাররাইট করা হবে তবে তার পরিবর্তে এটি যুক্ত করুন, -aবিকল্পটি যুক্ত করুন tee


9

আপনি scriptকমান্ডটি ব্যবহার করতে পারেন যা আপনার টার্মিনালে মুদ্রিত সমস্ত কিছুর টাইপস্ক্রিপ্ট ফাইল তৈরি করবে। এটি একটি কাঁটাযুক্ত শেল তৈরি করে এবং যতক্ষণ না শেলটি বের হয় ততক্ষণ সবকিছু রেকর্ড করে রাখে।

$ script my_output
Script started on Tue 28 Nov 2017 09:46:15 AM UTC
$ whoami
ajefferiss
$ exit
Script done on Tue 28 Nov 2017 09:46:27 AM UTC

তারপরে যদি আমি cat my_outputএকই আউটপুট পাই:

$ cat my_output
Script started on Tue 28 Nov 2017 09:46:15 AM UTC
$ whoami
ajefferiss
$ exit
exit

Script done on Tue 28 Nov 2017 09:46:27 AM UTC

6

আপনি শেলটির ডিবাগিং ফাংশন একসাথে এটি ব্যবহার করতে পারেন tee:

( set -x; command1 args...; command2 args ) 2>&1 | tee output.log
  • ( ... )একটি সাব-শেল শুরু করে যা আপনাকে সাব-শেলের মধ্যে সম্পাদিত সমস্ত কমান্ডের আউটপুট প্রবাহকে "সংগ্রহ" করতে দেয়। এটিতে setএই সাব-শেলটিতে নীচের কমান্ডের প্রভাব রয়েছে ।

  • set -xxশেল বিকল্পটি সক্ষম করে যা শেলটি চালানোর আগে স্ট্যান্ডার্ড ত্রুটি প্রবাহে চালিত সমস্ত কমান্ড মুদ্রণ করে।

  • 2>&1 স্ট্রিম 2 (স্ট্যান্ডার্ড আউটপুট) স্ট্রিম করতে পুনরায়নির্দেশ করে ire

  • | বাম কমান্ডের স্ট্যান্ডার্ড আউটপুট প্রবাহটি ডান কমান্ডের স্ট্যান্ডার্ড ইনপুট প্রবাহে পুনঃনির্দেশ করে।

  • tee FILEফাইল FILEএবং স্ট্যান্ডার্ড আউটপুটে স্ট্যান্ডার্ড ইনপুট স্ট্রিম অনুলিপি করে ।

যদি আপনার কমান্ড সিকোয়েন্সটি ইতিমধ্যে কোনও স্ক্রিপ্ট ফাইলে থাকে তবে এটি এটি চালানোর জন্য আরও অর্থবোধ করবে:

bash -x /path/to/script args... 2>&1 | tee output.log
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.