bash: ফাইল-এ -x লগ সেট করুন


18

set -xভার্বোজ / ডিবাগ আউটপুট সহ আমার একটি শেল স্ক্রিপ্ট রয়েছে :

#!/bin/bash

set -x
command1
command2
...

আউটপুটটি দেখতে এটির মতো দেখাচ্ছে:

+ command1
whatever output from command1
+ command2
whatever output from command2

আমার সমস্যা হচ্ছে, শেল আউটপুট (দ্বারা সৃষ্ট set -x) দ্বারা stderr, কম্যান্ডের আউটপুট (সঙ্গে মিশ্রিত করা যায় command1, command2, ...)। আমি স্ক্রিনে "স্বাভাবিক" আউটপুট (স্ক্রিপ্ট ওয়াইড ছাড়াই চালানো যেমন set -x) এবং বাশের "অতিরিক্ত" আউটপুট আলাদাভাবে কোনও ফাইলে পেয়ে খুশি হব ।

সুতরাং আমি এটি পর্দায় রাখতে চাই:

whatever output from command1
whatever output from command2

এবং এটি একটি লগ ফাইলে:

+ command1
+ command2

(লগ ফাইলের সাথে একসাথে সমস্ত কিছু থাকে তবে ঠিক আছে)

set -x 2> fileস্পষ্টত doens't, ডান প্রভাবী কারণ এটি সেট কমান্ডের আউটপুট নয়, কিন্তু এটি ব্যাশ আচরণ পরিবর্তন।

bash 2> fileপুরো স্ক্রিপ্টের জন্য ব্যবহার করাও সঠিক কাজ করে না, কারণ এটি প্রতিটি কমান্ডের স্টাডারকে পুনর্নির্দেশ করে যা এই শেলটিতে চালিত হয়, সুতরাং আমি কমান্ডগুলির ত্রুটি বার্তাটি দেখতে পাচ্ছি না।


2
আমার গুগল-ফু আজ সকালে শক্তিশালী বলে মনে হচ্ছে: স্ট্যান্ডার্ড্রাইভার
52-এ

উত্তর:


20

এই সার্ভারফল্ট উত্তরের উপর ভিত্তি করে স্ট্যান্ডার্ড আউটপুট ইন্টারুপ্ট না করে লগফাইলে বাশ- এক্স আউটপুট প্রেরণ করুন, ব্যাশের আধুনিক সংস্করণগুলিতে BASH_XTRACEFDএকটি আউটপুট জন্য একটি বিকল্প ফাইল বর্ণনাকারী নির্দিষ্ট করার জন্য বিশেষত অন্তর্ভুক্তset -x

উদাহরণস্বরূপ আপনি করতে পারেন

#!/bin/bash

exec 19>logfile
BASH_XTRACEFD=19

set -x
command1
command2
...

নিম্নলিখিত কমান্ডগুলির জন্য নিয়মিত স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটি প্রবাহ সংরক্ষণ set -xকরার logfileসময় ফাইলটিতে আউটপুট প্রেরণ করতে ।

নোট করুন এফডি 19 এর ব্যবহার স্বেচ্ছাসেবী - এটি কেবলমাত্র একটি উপলভ্য বর্ণনাকারী হওয়া দরকার (যেমন 0, 1, 2 বা অন্য নম্বর যা আপনি ইতিমধ্যে বরাদ্দ করেছেন)।


এটি প্রকৃতপক্ষে আলাদাভাবে ব্যাশের ট্রেস লগ সংরক্ষণ করে, তবে এটি সম্পূর্ণরূপে সিঙ্কের বাইরে থাকায় 2 আউটপুটগুলি (স্ক্রিনে stdout + stderr এবং লগ ফাইলগুলিতে ব্যাশ ট্রেস) পড়া সত্যিই শক্ত করে তোলে। আমি সবেমাত্র পোস্ট করেছি কী সমাধান দেখুন ।
15'15

4

এক বছরেরও বেশি সময় পরে আমি স্ক্রিনে "সাধারণ" আউটপুট (stdout + stderr - bash trace) এবং সমস্ত একসাথে (stdout + stderr + bash trace) উভয়ই একটি ফাইল (bash.log) এ থাকার সঠিক সমাধান খুঁজে পেয়েছি found :

exec   > >(tee -ia bash.log)
exec  2> >(tee -ia bash.log >& 2)
exec 19> bash.log

export BASH_XTRACEFD="19"
set -x

command1
command2

যে শুধু steeldriver এর উত্তর এবং সমন্বয় এই এক
জার্নো

3

স্টিল্ড্রাইভার আপনাকে একটি পন্থা দিয়েছে । বিকল্পভাবে, আপনি কেবল একটি ফাইলের মধ্যে STDERR পুনর্নির্দেশ করতে পারেন:

script.sh 2> logfile

তবে, এর অর্থ হ'ল দুটি দ্বারা নির্মিত আউটপুট set -x বিকল্প এবং অন্য যে কোনও ত্রুটিযুক্ত বার্তা উত্পাদিত হবে ফাইলটিতে। স্টিল্ড্রাইভারের সমাধানটি কেবলমাত্র set -xআউটপুটটিকে পুনর্নির্দেশ করবে যা সম্ভবত আপনি চান।


"... সেট-এক্স বিকল্পের দ্বারা নির্মিত অন্য আউটপুট এবং অন্য যে কোনও ত্রুটিযুক্ত বার্তা উত্পাদিত হবে ফাইলটিতে যাবে" "এবং সে কারণেই এটি আমার পক্ষে কার্যকর হয় না। আমার মূল সমস্যাটি হ'ল, আমি সহজেই "আসল ত্রুটিগুলি" দেখতে পাচ্ছি না, কারণ এই সমস্ত ব্যাশ আউটপুট স্ট্যাডারের কাছে যায়। কমান্ড ত্রুটি বার্তাগুলি পুনঃনির্দেশ করা আমাকে "সত্যিকারের ত্রুটিগুলি" আলাদাভাবে লুকিয়ে রাখবে।
redseven

@ রেডসেভেন আমি ভয় করছি আপনি যা চাইছেন তা খুব পরিষ্কার নয়। আপনি কি আপনার প্রশ্ন সম্পাদনা করতে এবং স্পষ্ট করতে পারেন? স্টাডাউট হয় না এমন কোনও কিছুর জন্য "আউটপুট" শব্দটি ব্যবহার এড়ানো চেষ্টা করুন। আপনি কি আলাদা করতে চান i) সাধারণ আউটপুট; ii) আপনার আদেশ এবং iii) দ্বারা নির্গত কোন ত্রুটি সেট -x? স্টিল্ড্রাইভারের উত্তর কি যথেষ্ট নয়? যদি তা না হয় তবে আমাদের একটি সহজ স্ক্রিপ্ট দেখান যা আমরা অনুলিপি করতে পারি এবং এটি কীভাবে আচরণ করতে চান তা আমাদের জানান।
টেরডন

@ স্টিল্ড্রাইভার ইতিমধ্যে প্রশ্নের সঠিক উত্তর দিয়েছেন।
redseven

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