আমি কীভাবে বলতে পারি যে বর্তমানে সম্পাদনকারী বাশ স্ক্রিপ্টটি -x দিয়ে ডিবাগিংয়ের জন্য আহ্বান করা হয়েছে?


11

আমার কাছে একটি স্ক্রিপ্ট রয়েছে launch.shযা নিজেকে অন্য ব্যবহারকারী হিসাবে চালিত করে যাতে সঠিক মালিকের সাথে ফাইল তৈরি করতে পারে। আমি এই অনুরোধে -x পাস করতে চাই যদি এটি মূলত স্ক্রিপ্টে দেওয়া হয়

if [ `whoami` == "deployuser" ]; then
  ... bunch of commands that need files to be created as deployuser
else
  echo "Respawning myself as the deployment user... #Inception"
  echo "Called with: <$BASH_ARGV>, <$BASH_EXECUTION_STRING>, <$->"
  sudo -u deployuser -H bash $0 "$@"  # How to pass -x here if it was passed to the script initially?
fi

আমি ব্যাশ ডিবাগিং পৃষ্ঠাটি পড়েছি তবে আসল স্ক্রিপ্টটি চালু হয়েছিল কিনা তা জানাতে কোনও পরিষ্কার বিকল্প নেই বলে মনে হচ্ছে -x

উত্তর:


15

bashকমান্ড লাইনে যে setপতাকাগুলি পাঠানো যেতে পারে সেগুলির অনেকগুলিই পতাকা। setঅন্তর্নির্মিত শেল যা রানটাইমগুলিতে এই পতাকাগুলি টগল করতে পারে। উদাহরণস্বরূপ, স্ক্রিপ্টটিকে কল bash -x foo.shকরা মূলত set -xস্ক্রিপ্টের শীর্ষে করা সমান ।

এটির setজন্য অন্তর্নির্মিত শেল এটি জেনে আমাদের কোথায় সন্ধান করা উচিত তা জানতে দেয়। এখন আমরা এটি করতে পারি help setএবং আমরা নিম্নলিখিতগুলি পাই:

$ help set
set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
...
      -x  Print commands and their arguments as they are executed.
...
    Using + rather than - causes these flags to be turned off.  The
    flags can also be used upon invocation of the shell.  The current
    set of flags may be found in $-.  The remaining n ARGs are positional
    parameters and are assigned, in order, to $1, $2, .. $n.  If no
    ARGs are given, all shell variables are printed.
...

সুতরাং এটি থেকে আমরা দেখতে পাচ্ছি যে $-আমাদের উচিত কী পতাকাগুলি সক্ষম করা আছে।

$ bash -c 'echo $-'
hBc

$ bash -x -c 'echo $-'
+ echo hxBc
hxBc

সুতরাং মূলত আপনার কেবল এটি করা দরকার:

if [[ "$-" = *"x"* ]]; then
  echo '`-x` is set'
else
  echo '`-x` is not set'
fi

বোনাস হিসাবে, আপনি যদি সমস্ত পতাকাগুলি অনুলিপি করতে চান তবে আপনিও করতে পারেন

bash -$- /other/script.sh

1
[[ $- == *x* ]]প্যাটার্ন মিলের জন্য আপনাকে ব্যবহার করতে হবে ।
গ্লেন জ্যাকম্যান

1
অথবা আপনি স্ট্যান্ডার্ড ব্যবহার করতে পারে case $- in *x*) ... ;; *) ... ;; esaccaseস্ক্রিপ্টগুলির জন্য এই ব্যবহারটি পোর্টেবল হিসাবে বোঝার জন্য এটি দরকারী এবং এখন আমি এটি সম্পর্কে জানি তবে আমি "বাশ-নির্দিষ্ট, তবে [[অন্যথায় case" মনে রাখার চেয়ে কেবল এটি মনে রাখা সহজ মনে করি ।
hvd

ঠিক আছে, তাহলে এই সম্পূর্ণ সিরিজের মন্তব্য মুছতে পারে।
l0b0

$-আউটপুট hB। আমাদের কি করতে -hএবং -Bপতাকা / আর্গুমেন্ট না? বাশ ম্যান পৃষ্ঠাতে আর দেখতে পাবেন না ।
ড্যান ড্যাসক্লেস্কু

3

set -oঅন্যথায় ব্যবহৃত xtrace onহলে আউটপুট হবে ।-xxtrace off


2

যদিও @ প্যাট্রিকের উত্তরটি "সঠিক" একটি, আপনি কেবলমাত্র একটি শিশুকে স্ক্রিপ্টে একটি প্যারামিটার বা রফতানি ভেরিয়েবল পাস করতে পারেন যা এটি করতে হবে - যেমন ট্রেসিং চালু করার মতো।

এটির অসুবিধা রয়েছে যা (আমি বিশ্বাস করি) আপনাকে প্রবেশ করতে চলেছে এমন প্রতিটি স্তরের স্ক্রিপ্টে আপনাকে এটি পুনরায় রফতানি করতে হবে।

এক্সট্রান্সিয়াস আউটপুট ইত্যাদি কেটে ফেলার জন্য - আপনার থেকে আউটপুট / পরিবর্তিত আচরণের প্রয়োজন কেবল স্ক্রিপ্ট (গুলি) বাছাই করে (বা অন্যথায় প্রভাব ফেলতে) এটির সুবিধা রয়েছে। উদাহরণস্বরূপ কলিং স্ক্রিপ্টের জন্য উদাহরণস্বরূপ ট্রেসিং বন্ধ থাকতে পারে এবং তথাকথিত স্ক্রিপ্টটি চালু করুন। এটি একটি সম্পূর্ণ বা কিছুই প্রস্তাব নয়।

আপনার প্রশ্নের অংশ নয়, তবে সম্পর্কিত:

আমি মাঝে মাঝে একটি ভেরিয়েবলের সংজ্ঞা দিই

E=""
E="echo "

অথবা

E=""
E=": "

এবং এটি ব্যবহার (একাধিক বিবৃতিতে) মত

"${E}" rsync ...

বা, কেবল দ্বিতীয় পরিবর্তনের জন্য,

"${E}" echo "this is a debugging message"

তারপরে, আমি কমান্ড (গুলি) চালাতে চাইলে আমি দ্বিতীয় সংজ্ঞাটি কেবল মন্তব্য করি। আপনি এই কৌশলটি কোনও পরামিতি বা রফতান পরিবর্তক পরিবর্তে ব্যবহার করতে পারেন।

এর মধ্যে দুটির সাথেই আপনাকে যৌগিক বিবৃতিতে নজর রাখতে হবে কারণ পদ্ধতিটি কেবল যৌগিক তালিকার প্রথম বিবৃতিতে কাজ করার গ্যারান্টিযুক্ত।


1

আপনি প্রক্রিয়াটির পিআইডি দখল করতে পারেন এবং তারপরে যুক্তিগুলি কী তা দেখতে পিএস সহ প্রক্রিয়া টেবিলটি পরীক্ষা করতে পারেন।


আপনি প্রক্রিয়াটি 'পিআইডি এর মাধ্যমে ধরতে পারেন: $$
পল ক্যালাব্রো

2
আমি মনে করি না যে এটি সাধারণভাবে একটি ভাল ধারণা, কারণ যদি -xস্ক্রিপ্টের ভিতরে সেট করা থাকে তবে এটি psআউটপুটে প্রদর্শিত হবে না । এবং এই সমাধান যাইহোক অক্ষম।
ভিঙ্ক 17

এটি একটি ন্যায্য যুক্তি। আমি আসলে $ - পরিবর্তনশীল সম্পর্কে জানতাম না। এটি সমাধান করার জন্য এটি আরও ভাল পদ্ধতির মতো বলে মনে হচ্ছে।
পল ক্যালাব্রো

1
set -oআমি প্রস্তাবিত সমাধান আছে । এটি এমন বিকল্পগুলির জন্যও কাজ করা উচিত যা সম্পর্কিত ফ্ল্যাগের মতো না -x
ভিঙ্ক 17
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.