मैं एक शेल स्क्रिप्ट पर काम कर रहा हूं, जो चर से एक जटिल कमांड का निर्माण करता है, उदाहरण के लिए इस तरह (एक तकनीक के साथ जो मैंने बीएफएस 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, तो मैं भी चाहता हूं कि यह कमांड एक वैरिएबल के अंदर हो ताकि मैं इसे syslog में लॉग कर सकूं।
बैश एफएक्यू इस उद्देश्य के लिए जाल और चर (उदाहरण के लिए डिबगिंग उद्देश्यों के लिए) का उपयोग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"
मुझे लगता है कि मुझे विस्तार करने के लिए eval का उपयोग 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}"
ऐसा लगता है कि इसे अच्छी तरह से संभालना है, लेकिन अगर कोई व्यक्ति किसी मुद्दे को देखता है तो मैं उत्सुक हूं।