अगर डिबगिंग के लिए -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*) ... ;; *) ... ;; esac। यह caseउन लिपियों के लिए उपयोग करने के लिए उपयोगी है जो पोर्टेबल होने के लिए होती हैं, और अब जब मुझे इसके बारे में पता है, तो मुझे यह याद रखना आसान है कि, "यदि बैश-विशिष्ट, फिर [[, और case" याद रखें ।
hvd

ठीक है, फिर टिप्पणियों की इस पूरी श्रृंखला को हटाया जा सकता है।
l0b0

$-आउटपुट hB। क्या करते हैं -hऔर -Bझंडे / तर्क करते हैं? फिर बैश मैन पेज में न देखें ।
डैन डस्केलस्क्यू

3

set -oxtrace onअगर -xउपयोग किया जाता है, तो आउटपुट करेगा xtrace off


2

हालाँकि @Patrick का उत्तर "सही" है, आप केवल अपने बच्चे की स्क्रिप्ट में एक पैरामीटर या निर्यातित चर पास कर सकते हैं जो यह बताता है कि क्या करना है - जैसे ट्रेसिंग चालू करें।

इसका नुकसान यह है कि (मेरा मानना ​​है) आपको उस स्क्रिप्ट के प्रत्येक स्तर पर फिर से निर्यात करना होगा जिसे आप दर्ज करने जा रहे हैं।

यह चुनिंदा स्क्रिप्ट (या अन्यथा प्रभावित) करने में सक्षम होने का लाभ है, बस स्क्रिप्ट (ओं) को आपको आउटपुट / संशोधित व्यवहार की आवश्यकता है - बाहरी आउटपुट पर कटौती करने के लिए, आदि .. जैसे कि कॉलिंग स्क्रिप्ट के लिए ट्रेसिंग बंद हो सकती है और अभी भी बुलाया स्क्रिप्ट में चालू हो। यह सब एक या कुछ नहीं प्रस्ताव है।

आपके प्रश्न का हिस्सा नहीं है, लेकिन संबंधित:

मैं कभी-कभी एक चर की तरह परिभाषित करता हूं

E=""
E="echo "

या

E=""
E=": "

और इसे (कई बयानों में) की तरह उपयोग करें

"${E}" rsync ...

या, सिर्फ दूसरी भिन्नता के लिए,

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

फिर, मैं केवल दूसरी परिभाषा बताता हूं, जब मैं चाहता हूं कि कमांड चलना चाहिए। आप इसके बजाय पैरामीटर या निर्यात चर के साथ इस तकनीक का उपयोग कर सकते हैं।

इन दोनों में से, आपको यौगिक कथनों को देखना होगा क्योंकि विधि केवल यौगिक सूची में पहले कथन पर काम करने की गारंटी है।


1

आप प्रक्रिया की पीआईडी ​​को पकड़ सकते हैं और फिर पीएस के साथ प्रक्रिया तालिका की जांच कर सकते हैं कि यह क्या तर्क है।


आप इस प्रक्रिया को 'पीआईडी ​​थ्रू: $$
पॉल कैलाब्रो

2
मुझे नहीं लगता कि यह सामान्य रूप से एक अच्छा विचार है, क्योंकि अगर -xस्क्रिप्ट के अंदर सेट किया गया था, तो इसे psआउटपुट में नहीं दिखाया जाएगा । और यह समाधान वैसे भी अक्षम है।
vinc17

यह एक उचित तर्क है। मैं वास्तव में $ चर के बारे में नहीं जानता था। ऐसा लगता है कि इसे हल करने के लिए एक बेहतर तरीका है।
पॉल कैलाब्रो

1
set -oमेरे द्वारा प्रस्तावित समाधान भी है । यह उन विकल्पों के लिए भी काम करना चाहिए जिनके पास संबंधित झंडा नहीं है -x
vinc17
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.