शेल में .bash_profile / .profile / bashrc में एक फ़ंक्शन कैसे जोड़ें?


24

मेरे पास एक फ़ंक्शन है जो आज तक के युग को परिवर्तित करता है। यहाँ परिभाषा है

date1(){
  date -d @$1
}

मैं लिखना चाहूंगा:

$ date1 xxxyyy

जहां xxxyyy वह पैरामीटर है जिसे मैं अपने फ़ंक्शन में पास करता हूं ताकि मुझे संबंधित तारीख मिल सके। मैं समझता हूँ कि मैं या तो में इसे जोड़ने के लिए है .bash_profile, .profileया .bashrcऔर फिर इसे स्रोत:

$ source file

लेकिन, मुझे यकीन नहीं है कि इसे किस फ़ाइल में डाला जाए। वर्तमान में, मेरे पास यह है .profile। लेकिन इसे चलाने के लिए, मुझे source .profileहर बार करना होगा।

आदर्श रूप से, इसे तब उपलब्ध करना चाहिए, जब कंप्यूटर पर्यावरण चर की तरह शुरू हो।


एक इनपुट नमूने के लिए; 1. टेक्स्ट आउटपुट epochconverter.com अब 1514917788 है; प्रति 2.from बैश ही $ तिथि +% s stackoverflow.com/questions/1092631/...
AnneTheAgile

जवाबों:


25

से man bash:

जब बैश को एक इंटरेक्टिव लॉगिन शेल के रूप में या एक गैर-इंटरेक्टिव शेल के रूप में - एल्गिन विकल्प के रूप में लागू किया जाता है, तो यह पहले फ़ाइल / आदि / प्रोफाइल से कमांड को पढ़ता है और निष्पादित करता है, यदि वह फ़ाइल मौजूद है। उस फ़ाइल को पढ़ने के बाद, यह उस क्रम में ~ / .bash_profile, ~ / .bash_login और ~ / .profile की तलाश करता है, और पहले मौजूद से कमांड पढ़ता और निष्पादित करता है और पढ़ने योग्य होता है।

दूसरे शब्दों में, आप इसे में से किसी एक में डाल सकता है ~/.bash_profile, ~/.bash_loginया ~/.profile, या किसी भी फाइल sourceउन दोनों में से किसी के द्वारा d । आमतौर पर ~/.profileस्रोत होगा ~/.bashrc, जो "व्यक्तिगत आरंभीकरण फ़ाइल है, लॉगिन गोले के लिए निष्पादित।"

इसे सक्षम करने के लिए, या तो एक नया शेल शुरू करें, चलाएं exec $SHELLया चलाएं source ~/.bashrc


1
वैसे मैंने यह तर्क है कि मुद्रण के एक कस्टम फ़ंक्शन बनाने के लिए अपना रास्ता आज़माया, लेकिन अगर मैं उस फ़ंक्शन को जोड़ देता हूं, .bash_profileतो भी मुझे source ~/.bash_profileशॉर्टकट द्वारा खुले टर्मिनल को हर बार करना होगा Ctrl+Alt+T
विक्की देव

@VickyDev यदि आपको source ~/.bash_profileहर बार करना है तो यह एक संकेत है कि आपका बैश सेटअप किसी भी तरह से अमानक या टूटा हुआ है (जैसा कि man bashआउटपुट में बताया गया है)। क्या आप वाकई बैश को चला रहे हैं? उदाहरण के लिए, क्या echo $BASHPIDकुछ भी प्रिंट करता है?
l0b0

क्या आपको किसी फ़ंक्शन को परिभाषित #!/bin/shकरने के लिए शीर्ष पर जोड़ने की आवश्यकता है .profile?
कोलोब कैन्यन

13

आपके द्वारा फ़ंक्शन को परिभाषित करने के बाद .profile, जोड़ें export -f date1। यह आपके लॉगिन शेल द्वारा उपयोग के लिए फ़ंक्शन को निर्यात करेगा।


निर्यात के लिए +1, मुझे ssh ProxyCommand में आह्वान और उपनाम देना पड़ा, और यह स्रोत के बाद भी उर्फ ​​नहीं मिलने के बारे में बताता रहा। निर्यात के बाद आकर्षण की तरह काम करता है।
अभिषेक आनंद

7

इंटरैक्टिव गोले के लिए अनुकूलन में जाते हैं ~/.bashrc। जब आप लॉग इन ~/.profile(या में लॉग इन करते हैं, तो आप जो चलाना चाहते हैं ~/.bash_profile, लेकिन यह अक्सर लोड नहीं होता है)

इस फंक्शन की परिभाषा को अंदर रखें ~/.bashrc

चूंकि बैश लोड नहीं होता है .bashrcजब यह एक लॉगिन शेल होता है, तो इसे करने के लिए मजबूर करें: एक ~/.bash_profileयुक्त लिखें

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

यानी लोड ~/.profile, और भी लोड ~/.bashrcअगर खोल इंटरैक्टिव है।

वैकल्पिक .bashrc और वहां से जुड़ी पोस्ट देखें ।


1

csh और tcsh, bash जैसे कार्यों का समर्थन नहीं करता है, लेकिन आप इसे कर सकते हैं।

उदाहरण के लिए यहाँ कुछ पाठ मुद्रित करने के लिए एक सरल कार्य है

alias print_hello_world 'eval echo "hello world"'

स्क्रिप्ट के लिए तर्क देना

repeate_after_me 'eval echo "$1"'

if स्टेटमेंट की तरह मल्टी लाइन कोड करना थोड़े जटिल है लेकिन यहाँ आप जाते हैं।

alias X 'eval "if (\!:1 =~ 'yes') then \\
          echo yes \\
          else \\
          echo no \\
          endif"'

आपको अभी भी खाली करना होगा लेकिन \!:[x]कमांड लाइन से इनपुट प्राप्त करने के लिए सबसे जटिल हिस्सा सिंटैक्स कर रहा है ।

जो आपको हल करने के लिए पर्याप्त होना चाहिए।


0

आप टाइपसेट के साथ bashrc करने के लिए सभी वर्तमान कार्यों को पुनर्निर्देशित कर सकते हैं ।

उदाहरण के लिए, यहाँ मैं bashrc में वैकल्पिक पैरामीटर के साथ एक ओपनस्टैक कमांड का एक फंक्शन जोड़ रहा हूँ:

urc() { . stackrc; set -x; openstack server list --all $1; set +x; }
typeset -f >> ~/.bashrc

अब इसे भविष्य के सत्रों के लिए सहेजा गया है, और इसका उपयोग किया जा सकता है:

$ urc 

या

$ urc --debug

-1

बिंदु 18: मेरी पुरानी मेमोरी में, जब एक एडमिन, ksh और bash सीखना, अन्य तरीके से किना था। 1: - / etc / प्रोफाइल कंटेंट sysWide हैं। / etc / skel में नए खातों को दी गई फ़ाइल शामिल थी। चूंकि बैश अब सभी डिस्ट्रो के प्रमुख हैं। अगला 2 होगा: - ~ /। सिस्टमाइल के रूप में .profile तब .profile की सामग्री के भीतर "यदि मौजूद है" .bash_profile डाल देगा -> 3: - .bash_profile 4: - .bash_login 5: -। bashrc .bash_aliases अंदर होगा। मेरे मन में अधिक सही क्रम, मानक टर्मिनल और शैल पर्यावरण और सामान्य रूप से स्थापित करना ।bash_login कभी नहीं मिला या मौजूदा (इसका कस्टम उपयोगकर्ता के लिए)। अगर $ PATH मुख्य होने के साथ।
अब मैं भी जोड़ रहा हूँ .bash_profile .profile अभी भी हावी है और .bash_profile की उपस्थिति का सम्मान नहीं कर रहा है। हेडर जानकारी के साथ-साथ कोई भी अपडेट नहीं हो रहा है: bash स्टार्टअप नमूने - कि निर्देशिका संरचना अब नहीं है - उदाहरणों और या फ़ाइलों के साथ gzip'd हैं। इसलिए ग्नू-बैश को अपडेट करना क्रम में है


1
आपका कामकाज कैसा चल रहा है?
Jesse_b
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.