क्या किसी अन्य स्क्रिप्ट को निष्पादित करने से पहले एक स्क्रिप्ट को प्रीलोड या शामिल करने का कोई अच्छा तरीका है? - दे घुमा के

मैं एक स्क्रिप्ट निष्पादित करने के लिए देख रहा हूँ, लेकिन यह हैनिष्पादित होने से पहले एक और स्क्रिप्ट शामिल करें। समस्या यह है कि, सम्मिलित स्क्रिप्ट उत्पन्न होगी और निष्पादित स्क्रिप्ट असंदिग्ध होगी। एक समाधान जो मैं लेकर आया था, उसमें लिपि को एक आवरण के रूप में शामिल करके, कॉलिंग के रूप में वास्तव में उल्टा था set निष्पादित स्क्रिप्ट के लिए तर्कों को सेट करना और फिर उसे डॉट करना / सोर्स करना। जैसे

#!/bin/bash
# Generated wrapper or include script.
: Performing some setup...

target_script=$1 ; shift
set -- "[email protected]"
. "$target_script"

कहा पे target_script स्क्रिप्ट मैं वास्तव में चलाने के लिए, आवरण से सेटिंग आयात करना चाहता हूँ।

हालाँकि, मेरे सामने संभावित समस्या यह है कि टारगेट स्क्रिप्ट या यहां तक ​​कि टारगेट स्क्रिप्ट के कॉल करने वाले खुद ही उम्मीद कर रहे होंगे $0 फ़ाइल सिस्टम पर इसके स्थान के पथ पर सेट होने के लिए। लेकिन क्योंकि यह आवरण दृष्टिकोण ओवरराइड करता है $0, का मूल्य $0 अप्रत्याशित हो सकता है और अपरिभाषित व्यवहार उत्पन्न कर सकता है।

क्या प्रभाव में है प्रदर्शन करने के लिए एक और तरीका है, a LD_PRELOAD लेकिन स्क्रिप्टेड रूप में, अपने रनटाइम मापदंडों के साथ हस्तक्षेप किए बिना बैश के माध्यम से?

मैंने देखा है --init-file या --rcfile, लेकिन ये केवल इंटरैक्टिव गोले के लिए शामिल किए गए प्रतीत होते हैं।

उत्तर:

उत्तर № 1 के लिए 1

Forcing interactive mode does seem to allow me to specify --rcfile:

$ bash --rcfile /tmp/x-include.sh -i /tmp/xx.sh
include_script: $0=bash, $BASH_SOURCE=/tmp/x-include.sh
target_script: $0=/tmp/xx.sh, $BASH_SOURCE=/tmp/xx.sh

की सामग्री x-include.sh स्क्रिप्ट:

#!/bin/bash
echo "include_script: $0=$0, $BASH_SOURCE=$BASH_SOURCE"

की सामग्री xx.sh स्क्रिप्ट:

#!/bin/bash
echo "target_script: $0=$0, $BASH_SOURCE=$BASH_SOURCE"

जवाब के लिए 0 № 2

बैश प्रलेखन से:

When bash is started non-interactively, to run a shell script, for example, it looks for the variable  BASH_ENV  in
the  environment,  expands its value if it appears there, and uses the expanded value as the name of a file to read
and execute.  Bash behaves as if the following command were executed:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
but the value of the PATH variable is not used to search for the file name.

So that settles it then:

BASH_ENV=/tmp/x-include.sh /bin/bash /tmp/xx.sh

संबंधित सवाल
सबसे लोकप्रिय