আমি একটি শেল স্ক্রিপ্টে কাজ করছি যা ভেরিয়েবলগুলি থেকে একটি জটিল কমান্ড তৈরি করে, উদাহরণস্বরূপ (এমন একটি কৌশল সহ যা আমি বাশ FAQ থেকে শিখেছি ):
#!/bin/bash
SOME_ARG="abc"
ANOTHER_ARG="def"
some_complex_command \
${SOME_ARG:+--do-something "$SOME_ARG"} \
${ANOTHER_ARG:+--with "$ANOTHER_ARG"}
এই স্ক্রিপ্টটি পরিবর্তনশীল পরামিতি যোগ করা --do-something "$SOME_ARG"এবং --with "$ANOTHER_ARG"করতে some_complex_commandযদি এই ভেরিয়েবল সংজ্ঞায়িত করা হয়। এখন পর্যন্ত এটি ঠিকঠাক কাজ করছে।
তবে এখন আমি কমান্ডটি চালানোর সময় মুদ্রণ বা লগ করতে সক্ষম হতে চাই, উদাহরণস্বরূপ যখন আমার স্ক্রিপ্টটি ডিবাগ মোডে চালিত হয়। সুতরাং যখন আমার স্ক্রিপ্টটি চলবে some_complex_command --do-something abc --with def, আমি এই কমান্ডটি একটি ভেরিয়েবলের ভিতরে রাখতে চাই যাতে আমি উদাহরণস্বরূপ এটি সিসলগে লগইন করতে পারি।
বাশ এফএকিউ এই উদ্দেশ্যে ফাঁদ এবং পরিবর্তনশীল (উদাহরণস্বরূপ ডিবাগিং উদ্দেশ্যে) ব্যবহার করারDEBUG$BASH_COMMAND জন্য একটি কৌশল প্রদর্শন করে । আমি নিম্নলিখিত কোড সহ চেষ্টা করেছি:
#!/bin/bash
ARG="test string"
trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG"
echo "Command was: ${COMMAND}"
এটি কাজ করে, তবে কমান্ডের মধ্যে ভেরিয়েবলগুলি প্রসারিত করে না:
host ~ # ./test.sh
test string
Command was: echo "$ARG"
আমার ধারণা আমি প্রসারিত echo "$ARG"করতে ইওল ব্যবহার করতে হবে echo test string(কমপক্ষে আমি evalএখনও ছাড়া উপায় খুঁজে পাইনি )। নিম্নলিখিত কাজ করে:
eval echo "Command was: ${COMMAND}"
এটি নিম্নলিখিত আউটপুট উত্পাদন করে:
host ~ # ./test.sh
test string
Command was: echo "$ARG"
Command was: echo test string
তবে আমি যদি evalনিরাপদে এভাবে ব্যবহার করতে পারি তবে আমি সত্যই নিশ্চিত নই । আমি কিছু জিনিস শোষণ করার ব্যর্থ চেষ্টা করেছি:
#!/bin/bash
ARG="test string; touch /x"
DANGER='$(touch /y; cat /etc/shadow)'
trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG" $DANGER
echo "Command was: ${COMMAND}"
eval echo "Command was: ${COMMAND}"
এটি এটিকে ভালভাবে পরিচালনা করছে বলে মনে হয় তবে আমি আগ্রহী যদি অন্য কোনও সমস্যা মিস করে যা আমি দেখি।