আপনি যখন অ্যালিগিটারগুলিতে আপনার ঘাড়ে পৌঁছান, তখন ভুলে যাওয়া সহজ যে গোলটি সোয়াম্পটি নিকাশ করা ছিল।
- জনপ্রিয় উক্তি
প্রশ্নটি সম্পর্কে echo, এবং এখনও অবধি বেশিরভাগ উত্তর কীভাবে কোনও set +xকমান্ডকে ছিনতাই করতে হবে সেদিকে মনোনিবেশ করেছে a এর একটি আরও সহজ, আরও প্রত্যক্ষ সমাধান রয়েছে:
{ echo "Message"; } 2> /dev/null
(আমি স্বীকার করি যে আমি { …; } 2> /dev/null
যদি পূর্বের উত্তরগুলিতে না দেখি তবে আমি এটি সম্পর্কে ভাবতে পারি না))
এটি কিছুটা কষ্টকর, তবে, যদি আপনার ক্রমাগত echoকমান্ডগুলির একটি ব্লক থাকে, তবে আপনাকে পৃথকভাবে প্রতিটিটির জন্য এটি করার প্রয়োজন হবে না:
{
echo "The quick brown fox"
echo "jumps over the lazy dog."
} 2> /dev/null
মনে রাখবেন যে আপনার যখন নিউলাইনগুলি থাকে তখন আপনাকে সেমিকোলনগুলির প্রয়োজন হয় না।
আপনি কোনও/dev/null মানের-অ-স্ট্যান্ডার্ড ফাইল বর্ণনাকারীর (যেমন, 3) স্থায়ীভাবে
খোলার কেনোরব ধারণাটি ব্যবহার করে টাইপিং বোঝা হ্রাস করতে পারেন এবং তারপরে সর্বকালের 2>&3পরিবর্তে বলে 2> /dev/null।
এই লেখার সময়ে প্রথম চার উত্তর বিশেষ কিছু করছেন প্রয়োজন (এবং বেশিরভাগ ক্ষেত্রেই, কষ্টকর মধ্যে)
যে কত সময় আপনি একটি না echo। আপনি যদি সত্যিকার অর্থে সমস্ত echo কমান্ডগুলি কার্যকর করতে চান (এবং কেন আপনি না?) দমন করতে চান , তবে আপনি প্রচুর কোড মংগ না করে বিশ্বব্যাপী এটি করতে পারেন। প্রথমত, আমি লক্ষ করেছি যে এলিয়াসগুলি সনাক্ত করা যায় না:
$ myfunc()
> {
> date
> }
$ alias myalias="date"
$ set -x
$ date
+ date
Mon, Oct 31, 2016 0:00:00 AM # Happy Halloween!
$ myfunc
+ myfunc # Note that function call is traced.
+ date
Mon, Oct 31, 2016 0:00:01 AM
$ myalias
+ date # Note that it doesn’t say + myalias
Mon, Oct 31, 2016 0:00:02 AM
(নোট নিম্নলিখিত স্ক্রিপ্ট স্নিপেট কাজ যদি কুঁড়েঘর যে #!/bin/sh, এমনকি যদি /bin/shব্যাশ একটি লিঙ্ক হলে কুঁড়েঘর হয়। কিন্তু, #!/bin/bash, আপনি একটি যোগ করতে হবে shopt -s expand_aliasesএকটি স্ক্রিপ্ট কাজ করার alias লেখা পেতে কমান্ড।)
সুতরাং, আমার প্রথম কৌশলটির জন্য:
alias echo='{ set +x; } 2> /dev/null; builtin echo'
এখন, যখন আমরা বলি echo "Message", আমরা উপনামটি কল করছি, যা সনাক্ত করা যায় না। setকমান্ডটি থেকে ট্রেস বার্তাটি দমন করার সময় (নাম 50501515 এর উত্তরে প্রথমে উপস্থাপিত কৌশলটি ব্যবহার করা হয়েছে ), এবং তারপরে প্রকৃত echoকমান্ডটি কার্যকর করে তার নামটি ট্রেস বিকল্পটি বন্ধ করে দেয় । এটি আমাদের প্রতিটি echo কমান্ডে কোড সম্পাদনা করার প্রয়োজন ছাড়াই ব্যবহারকারীর 5071535 এর উত্তরের মতো একটি প্রভাব পেতে দেয় । তবে, এই পাতাগুলি ট্রেস মোডটি বন্ধ করে দিয়েছে। আমরা একটি set -xনাম রাখি না (বা কমপক্ষে সহজেই নয়) কারণ একটি উপাধি কেবল একটি শব্দের জন্য একটি স্ট্রিং প্রতিস্থাপন করতে দেয়; আর্গুমেন্টের পরে (যেমন, "Message") কমান্ডের মধ্যে উলামের স্ট্রিংয়ের কোনও অংশই ইনজেক্ট করা যাবে না
। সুতরাং, উদাহরণস্বরূপ, যদি স্ক্রিপ্ট থাকে
date
echo "The quick brown fox"
echo "jumps over the lazy dog."
date
আউটপুট হবে
+ date
Mon, Oct 31, 2016 0:00:03 AM
The quick brown fox
jumps over the lazy dog.
Mon, Oct 31, 2016 0:00:04 AM # Note that it doesn’t say + date
তাই আপনি এখনও বার্তা (গুলি) প্রদর্শন করার পর ট্রেস বিকল্প আবার চালু করতে হবে - যে পরে কিন্তু শুধুমাত্র একবার ব্লক পরপর এর echoকমান্ড:
date
echo "The quick brown fox"
echo "jumps over the lazy dog."
set -x
date
এটি ভাল হবে যদি আমরা এর set -xপরে স্বয়ংক্রিয়ভাবে তৈরি করতে echoপারি - এবং আমরা আরও কিছু চালাকি করে with তবে আমি এটি উপস্থাপন করার আগে এটি বিবেচনা করুন। #!/bin/sh -exওপিতে একটি শিবাং ব্যবহার করা স্ক্রিপ্টগুলি দিয়ে শুরু করা হচ্ছে । স্পষ্টতই ব্যবহারকারী xশিবাং থেকে এটি সরিয়ে ফেলতে পারে এবং একটি স্ক্রিপ্ট থাকতে পারে যা কার্যকরভাবে চিহ্নিত না করে সাধারণভাবে কাজ করে। এটি ভাল হয় যদি আমরা এমন কোনও সমাধান তৈরি করতে পারি যা সেই সম্পত্তি ধরে রাখে। এখানে প্রথম কয়েকটি উত্তর সেই সম্পত্তিটিকে ব্যর্থ করে কারণ তারা echoবিবৃতি দেওয়ার পরে "পিছনে" চালু করে , নিঃশর্তভাবে, এটি ইতিমধ্যে চালু ছিল কিনা তা বিবেচনা ছাড়াই।
এই উত্তরটি প্রতিস্থাপনকারী হিসাবে ইস্যুটি স্বীকৃতি দিতে ব্যর্থ হয়েছে echoট্রেস আউটপুট সঙ্গে আউটপুট; সুতরাং, ট্রেসিং বন্ধ করা থাকলে সমস্ত বার্তা নিখোঁজ হয়। আমি এখন এমন একটি সমাধান উপস্থাপন করব যা শর্তসাপেক্ষে একটি echoবিবৃতি দেওয়ার পরে ট্রেসিং ফিরিয়ে দেয় - কেবল যদি এটি ইতিমধ্যে চালু ছিল। এটিকে এমন একটি সমাধানে ডাউনগ্রেড করা যা শর্তহীনভাবে "পিছনে" ট্রেসিংয়ের দিকে পরিণত হয় তুচ্ছ এবং ব্যায়াম হিসাবে ছেড়ে যায়।
alias echo='{ save_flags="$-"; set +x;} 2> /dev/null; echo_and_restore'
echo_and_restore() {
builtin echo "$*"
case "$save_flags" in
(*x*) set -x
esac
}
$-বিকল্প তালিকা; সেট করা সমস্ত বিকল্পের সাথে সম্পর্কিত চিঠির একটি সংক্ষেপণ। উদাহরণস্বরূপ, eএবং যদি xবিকল্পগুলি সেট করা থাকে তবে তারপরে $-অক্ষরগুলির ঝাঁকুনি থাকবে eএবং এতে x। আমার নতুন উপনাম (উপরে) $-ট্রেসিং বন্ধ করার আগে মান সংরক্ষণ করে । তারপরে, ট্রেসিং বন্ধ হয়ে গেলে এটি শেল ফাংশনে নিয়ন্ত্রণ ছুঁড়ে দেয়। এই ফাংশনটি আসলটি করে echo
এবং তারপরে উপন্যাসটি চালিত হওয়ার পরে xবিকল্পটি চালু হয়েছিল কিনা তা যাচাই করে । বিকল্পটি চালু থাকলে, ফাংশনটি এটি আবার চালু করে; যদি এটি বন্ধ ছিল, ফাংশনটি এটি ছেড়ে দেয়।
shoptস্ক্রিপ্টের শুরুতে আপনি উপরের সাতটি লাইন সন্নিবেশ করতে পারেন (আটটি যদি আপনি একটি অন্তর্ভুক্ত করেন ) এবং বাকীটি একা রেখে যান।
এটি আপনাকে অনুমতি দেবে
- নিম্নলিখিত শেবাং লাইন ব্যবহার করতে:
#! / বিন / এস-এক্স
#! / বিন / শি -e
#! / বিন / শ এক্স
বা ঠিক সরল#! / বিন / SH
এবং এটি প্রত্যাশা অনুযায়ী কাজ করা উচিত।
- কোড মত আছে
(shebang)
কমান্ড 1
কমান্ড 2
কমান্ড 3
সেট -x
কমান্ড 4
কমান্ড 5
কমান্ড 6
সেট + এক্স
কমান্ড 7
কমান্ড 8
কমান্ড 9
এবং
- 4, 5, এবং 6 কমান্ডগুলি সনাক্ত করা হবে - যদি না তাদের একটির একটি হয়
echo, তবে এটি কার্যকর করা হবে তবে সনাক্ত করা হবে না। (তবে 5 কমান্ডটি একটি echoহলেও, 6 কমান্ডটি এখনও সনাক্ত করা হবে))
- 7, 8, এবং 9 আদেশগুলি সনাক্ত করা যাবে না। 8 কমান্ডটি একটি
echoহলেও, 9 কমান্ডটি এখনও সনাক্ত করা যাবে না।
- 1, 2, এবং 3 আদেশগুলি শিবাংয়ের অন্তর্ভুক্ত কিনা তার উপর নির্ভর করে (4, 5 এবং 6 এর মতো) সনাক্ত করা হবে (নয়, 7, 8 এবং 9)
x।
পিএস আমি আবিষ্কার করেছি যে, আমার সিস্টেমে, আমি builtinআমার মধ্যম উত্তরে কীওয়ার্ডটি রেখে দিতে পারি (যার জন্য এটি কেবলমাত্র একটি উপনাম echo)। এটি আশ্চর্যজনক নয়; বাশ (1) বলেছেন যে, ওরফে সম্প্রসারণের সময়,…
… এমন একটি শব্দ যা একটি উপনামের সমান যা প্রসারিত হচ্ছে তা দ্বিতীয় বার প্রসারিত হয় না। এর অর্থ এই যে এক ওরফে পারে lsথেকে ls -F, উদাহরণস্বরূপ, এবং ব্যাশ যাও recursively প্রতিস্থাপন পাঠ্য প্রসারিত করতে চেষ্টা করে না।
না খুব আশ্চর্যজনক, গত উত্তর (সঙ্গে এক echo_and_restore) বিফল হয় builtinশব্দ বাদ দেওয়া হয় 1 । তবে, আমি যদি মুছে ফেলা builtinএবং অর্ডারটি স্যুইচ করি তবে অদ্ভুতভাবে এটি কাজ করে:
echo_and_restore() {
echo "$*"
case "$save_flags" in
(*x*) set -x
esac
}
alias echo='{ save_flags="$-"; set +x;} 2> /dev/null; echo_and_restore'
__________
1 মনে হয় এটি অনির্ধারিত আচরণের জন্ম দেয়। আমি দেখা করেছি
- একটি অসীম লুপ (সম্ভবত সীমাহীন পুনরাবৃত্তির কারণে),
- একটি
/dev/null: Bad addressত্রুটি বার্তা, এবং
- একটি কোর ডাম্প
echo +x; echo "$*"; echo -xকোনও উপামের সমতুল্য কোনও উপায় উপস্থাপন করতে পারে তবে আমি এটি দেখতে চাই।