বাশ: cho -x। প্রতিধ্বনি থেকে পৃথক লাইনগুলি এড়িয়ে চলুন


11

বাশ-এ, -xবিকল্পটি চালানোর সময় , স্বতন্ত্র আদেশগুলি প্রতিধ্বনিত হওয়া থেকে ছাড় দেওয়া কি সম্ভব?

আমি আউটপুটটিকে যতটা সম্ভব পরিষ্কার করার চেষ্টা করছি, তাই আমি আমার স্ক্রিপ্টের কয়েকটি অংশ সাবস্কেলের সাথে চালাচ্ছি set +x। তবে সারিটি set +xনিজেই প্রতিধ্বনিত এবং আউটপুটটিতে কোনও মূল্যবান তথ্য যুক্ত করে না।

আমার মনে আছে খারাপ পুরানো .batদিনগুলিতে, যখন চলার সময় echo on, পৃথক লাইনগুলি একটি দিয়ে শুরু করে ছাড় দেওয়া যেতে পারে @। বাশে কি সমান আছে?

#!/bin/bash -x

function i_know_what_this_does() {
  (
    set +x
    echo do stuff
  )
}

echo the next-next line still echoes 'set +x', is that avoidable?
i_know_what_this_does
echo and we are back and echoing is back on

উপরের চলমান সময়, আউটপুট হয়:

+ echo the next-next line still echoes 'set +x,' is that 'avoidable?'
the next-next line still echoes set +x, is that avoidable?
+ i_know_what_this_does
+ set +x
do stuff
+ echo and we are back and echoing is back on
and we are back and echoing is back on

উত্তর:


22

xtraceআউটপুট, stderr হবে যায় যাতে আপনি পুনর্নির্দেশ পারে stderrথেকে /dev/null:

i_know_what_this_does() {
  echo do stuff
} 2> /dev/null

আপনি যদি এখনও ফাংশনের অভ্যন্তরে কমান্ডগুলি থেকে ত্রুটিগুলি দেখতে চান তবে আপনি এটি করতে পারেন

i_know_what_this_does() (
  { set +x; } 2> /dev/null # silently disable xtrace
  echo do stuff
)

সাবসেলের মাধ্যমে সেই ফাংশনের জন্য স্থানীয় সুযোগ দেওয়ার (...)পরিবর্তে এর ব্যবহারটি নোট করুন {...}bash, সংস্করণ 4.4 এখন সমর্থন যেহেতু local -ফাংশন (অনুরূপ স্থানীয় অপশন করতে Almquist শেল মত set -o localoptionsমধ্যে zsh), তাই আপনি করে subshell এড়াতে পারে:

i_know_what_this_does() {
  { local -; set +x; } 2> /dev/null # silently disable xtrace
  echo do stuff
}

bash৪.০ থেকে ৪.৩ এর বিকল্প হ'ল $BASH_XTRACEFDভেরিয়েবলটি ব্যবহার করা এবং তার জন্য একটি ডেডিকেটেড ফাইল বর্ণনাকারী খোলা থাকে /dev/null:

exec 9> /dev/null
set -x
i_know_what_this_does() {
  { local BASH_XTRACEFD=9; } 2> /dev/null # silently disable xtrace
  echo do stuff
}

যেহেতু ক্লোজ-অন-এক্সিকিউটিভ ফ্ল্যাগের bashসাথে একটি এফডি চিহ্নিত করার দক্ষতার অভাব রয়েছে , এর ফলে এইফডিটি অন্যান্য কমান্ডগুলিতে ফাঁস হওয়ার পার্শ্ব প্রতিক্রিয়া রয়েছে।

POSIX স্ক্রিপ্টগুলিতে ভেরিয়েবল এবং ফাংশনগুলির জন্য স্থানীয় স্কোপ বাস্তবায়নের জন্য কয়েকটি ফাংশন সমেত এই লোকভার.শ দেখুন এবং সেগুলি অ্যাক্ট্রেস ডি বা না করার জন্য প্রদান করে এবং ফাংশন সরবরাহ করে ।trace_fnuntrace_fn


খুব সুন্দর! আমি ফাংশনটিতে নিজেই প্রয়োগ করতে পারি এমন কোনও সংশোধক রয়েছে কিনা তা আমি সন্ধান করছিলাম তবে স্ট্যাডারকে কেবল পুনঃনির্দেশ করার বিষয়ে আমি ভাবিনি। ধন্যবাদ!
ক্লেক

1
BTW, stchaz.free.fr/which_interpreter একই পাতা থেকে বেশ ভালো এবং ধকল হয়। :-)
ক্লেক

এবং এখন আমি আবার এখানে এসেছি দ্বিতীয় পদ্ধতির জন্য, দরকারী স্ট্যাডার আউটপুটকে স্তব্ধ না করে সেট + এক্স সিলেন্স করে। আবার ধন্যবাদ!
ক্লেক

2

set +xমুদ্রিত হওয়ার কারণটি হ'ল এর set -xঅর্থ হল "চালানোর আগে আপনি যে কমান্ডটি চালাচ্ছেন তার প্রিন্ট করুন So জিনিসগুলি মুদ্রণ করার জন্য knowledge আমার জ্ঞানের সর্বোপরি, এটি হওয়া থেকে বিরত হওয়ার কোনও উপায় নেই।


0

আপনি যে সমাধানটি সন্ধান করেছেন তা এখানে:

function xtrace() {
  # Print the line as if xtrace was turned on, using perl to filter out
  # the extra colon character and the following "set +x" line.
  (
    set -x
    # Colon is a no-op in bash, so nothing will execute.
    : "$@"
    set +x
  ) 2>&1 | perl -ne 's/^[+] :/+/ and print' 1>&2
  # Execute the original line unmolested
  "$@"
}

মূল কমান্ড একই শেলের মধ্যে একটি পরিচয় রূপান্তরের আওতায় কার্যকর করে। দৌড়ানোর ঠিক আগে, আপনি আর্গুমেন্টগুলির একটি পুনরাবৃত্ত xtrace পাবেন race এটি আপনাকে প্রতিটি "প্রতিধ্বনি" কমান্ডের সদৃশ অনুলিপি দিয়ে স্ট্যামার স্প্যামিং ছাড়াই যত্নশীল কমান্ডগুলি অস্ট্রেস করতে দেয়।

# Example
echo "About to do something complicated ..."
xtrace do_something_complicated

বা এড়াতে perl(এবং মাল্টি-লাইন কমান্ডগুলির সাথে সমস্যা):+() { :;} 2> /dev/null; xtrace() { (PS4=; set -x; + "$@";{ set +x; } 2> /dev/null); "$@";}
স্টাফেন চেজেলাস

না, দুঃখিত, unix.stackexchange.com/a/60049/17980 হল আমি যে সমাধানটি খুঁজছিলাম। :-) set -xকৌশলগুলি কি আমাকে তুলনায় কিছু কিনে দেয় printf >&2 '+ %s\n' "$*"?
ক্লেক

যেমনটি রয়েছে:xtrace() { printf >&2 '+ %s\n' "$*"; "$@"; }
ক্লেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.