क्या "" का उपयोग करना ठीक है स्रोत के बजाय फ़ाइलों को चलाने के लिए - Ubuntu और OS X में .bashrc?


11

ठीक है, इसलिए sourceस्क्रिप्ट को वर्तमान शेल में और .अलग से चलाता है , जैसा कि "और" के साथ चलने वाली स्क्रिप्ट में विस्तृत है उदाहरण के लिए "स्रोत" के साथ , लेकिन, विशेष रूप से, मेरी .bashrcफ़ाइल में, मेरे पास है:

[ -f ~/.bash_aliases ] && source ~/.bash_aliases
[ -f ~/.git-completion.bash ] && source ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && source ~/.autojump/etc/profile.d/autojump.sh

क्या मैं इसे बदल सकता हूँ:

[ -f ~/.bash_aliases ] && . ~/.bash_aliases
[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash
[ -s ~/.autojump/etc/profile.d/autojump.sh ] && . ~/.autojump/etc/profile.d/autojump.sh

क्या यह OS X पर काम करेगा - क्या यह "POSIX" समस्या है?

मैंने इसे आजमाया और ऊपर अभी भी उबंटू पर काम करना प्रतीत होता है (इसलिए वे वास्तव में दोनों के साथ काम करते हैं sourceऔर ., वे मुझे शेल में वांछित कार्यक्षमता देते हैं)। क्या मुझे एक को चुनना चाहिए, या मैं कुछ याद कर रहा हूं?

एफडब्ल्यूआईडब्ल्यू, ओएस एक्स पर, मैं अपने .bashrcसे मेरे स्रोत .bash_profile


1
यदि यह 'श' आधारित गोले हैं तो मैं उपयोग करूंगा। ' वैश्विक अनुकूलता के लिए और यदि आप 'csh' आधारित गोले का उपयोग कर रहे हैं तो मैं स्रोत का उपयोग करूंगा।
mdpc

2
लिंक की गई पोस्ट में आप यह कहाँ देख रहे हैं कि " sourceवर्तमान शेल में स्क्रिप्ट .अलग से चलती है "? वे दोनों इसे मौजूदा खोल में चलाते हैं; अन्यथा वहाँ कोई मतलब नहीं होगा
माइकल Mrozek

जवाबों:


11

यह POSIX की परिभाषा है .dot:

शेल मौजूदा वातावरण में फ़ाइल से कमांड निष्पादित करेगा।

यदि फ़ाइल में कोई सम्‍मिलित नहीं है /<slash>, तो शेल $PATHडायरेक्टरी फ़ाइल को खोजने के लिए निर्दिष्ट खोज पथ का उपयोग करेगा । सामान्य आदेश खोज के विपरीत, हालांकि, .dot उपयोगिता द्वारा खोजी गई फ़ाइल निष्पादन योग्य नहीं है। यदि कोई पठनीय फ़ाइल नहीं मिली है, तो एक गैर-संवादात्मक शेल गर्भपात करेगा; एक इंटरेक्टिव शेल मानक त्रुटि के लिए एक नैदानिक ​​संदेश लिखेगा, लेकिन इस स्थिति को वाक्यविन्यास त्रुटि नहीं माना जाएगा।

उपरोक्त को ध्यान में रखते हुए, आप बस अपने [ -f ./file ] && source ./fileको . ./fileपूरी तरह से बदल सकते हैं। अगर फ़ाइल वहाँ नहीं है जो सबसे खराब है, तो आप लॉगिन पर एक नोटिस प्राप्त करेंगे - जो संभवतः वह जानकारी है जो आप चाहते हैं, मुझे लगता है।

बेशक अगर आप परीक्षा में रहते हैं तो आप ऐसा कर सकते हैं:

test -f ./file && . $_

2
ओह, लोग जानते हैं $_, मुझे वह पसंद है। :)
एंड्रियास विसे

@AndreasWiese - हर किसी को - यह POSIX द्वारा परिभाषित केवल कुछ 7 विशेष मापदंडों में से एक है।
mikeserv

+1 मैंने test -f /.file && . $_यहां दिखाए गए दृष्टिकोण का उपयोग करके समाप्त कर दिया
माइकल डुरंट

6
@mikeserv नहीं, $_POSIX द्वारा मानकीकृत नहीं है। 8 विशेष मानकों हैं $@, $*, $#, $$, $!, $?, $-और $0$_है स्पष्ट रूप से छोड़े गए । आपकी गलत टिप्पणी ने एक प्रश्न को जन्म दिया ।
गाइल्स का SO- बुराई पर रोक

19

में bash, .और sourceपर्यायवाची हैं। जांच कर रहे bashस्रोत कोड, फ़ाइल builtin/source.def, आप देख सकते हैं .और sourceएक ही आंतरिक फ़ंक्शन का उपयोग करें source_builtin:

$BUILTIN source
$FUNCTION source_builtin
$SHORT_DOC source filename [arguments]
Execute commands from a file in the current shell.

Read and execute commands from FILENAME in the current shell.  The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.

Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
$END

$BUILTIN .
$DOCNAME dot
$FUNCTION source_builtin
$SHORT_DOC . filename [arguments]
Execute commands from a file in the current shell.

लेकिन sourcePOSIX संगत नहीं है, इसलिए यदि आपकी स्क्रिप्ट POSIX के साथ कॉल की जाती है /bin/sh, तो आपको .इसके बजाय उपयोग करना चाहिए source। चूंकि POSIX शेल को प्रतिबंधित नहीं करता है, इसलिए आपके सभी उपरोक्त स्क्रिप्ट काम करेंगे।

व्यक्तिगत रूप से, मैं हमेशा के .बजाय का उपयोग करें source। (बहुत सारी पटकथाएँ जो मैंने लिखी हैं, उनके अंतर्गत चलती हैं cron)।


सभी चीजें समान होने के कारण, "के बजाय" स्रोत "का उपयोग करें।" एक कारण से: "के लिए खोज / grep करने का प्रयास करें।" एक बड़ी स्क्रिप्ट में भाव। यह एक दुःस्वप्न है।
16'14

हालांकि यह उत्तर बताता है कि क्यों का उपयोग .करना आम तौर पर उपयोग करने से "बेहतर" है source, जैसा कि @abonet कहते हैं, sourceखोज करने के लिए बहुत आसान है। चूंकि पीरियड्स कई भाषाओं में विराम चिह्न हैं, इसलिए आंख को सिर्फ उन पर छोड़ना आसान है। इसलिए मैं उपयोग करना पसंद करता हूं source
जो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.