जवाबों:
से बैश टिप्स और ट्रिक्स: शैली के साथ 'सीडी' :
अंत में, मैं आपको दिखाना चाहता हूं कि 'सीडी' कमांड के लिए अपने स्वयं के कस्टम प्रतिस्थापन को कैसे लिखना है।
क्या आप खुद को हमेशा एक निर्देशिका में बदलने पर एक ही चीज़ टाइप करते हुए पाते हैं? आप शायद कम से कम फ़ाइलों को हर बार सूचीबद्ध करते हैं, शायद इतना कि आपके हाथ हर 'सीडी' के बाद स्वचालित रूप से 'एलएस' टाइप करें।
ठीक है, हर तरह की कोशिश करके, जिसके बारे में मैं सोच सकता था, यह पता चला कि हम जो लक्ष्य खोज रहे हैं उसे ठीक से पूरा करने का एक ही तरीका है। हमें एक शेल फंक्शन बनाना होगा।
शेल फ़ंक्शन शेल प्रोग्रामिंग का हिस्सा हैं। संकलित प्रोग्रामिंग भाषाओं की तरह, फ़ंक्शन एक प्रकार की प्रक्रियात्मक रूपांतरकता प्रदान करते हैं। अलग-अलग मापदंडों के साथ तर्क या अभिकलन के अक्सर उपयोग किए जाने वाले बिट को निष्पादित करने के लिए एक सामान्य कार्य बना सकते हैं। इस मामले में, पैरामीटर वर्तमान कार्यशील निर्देशिका है।
यहाँ एक सरल है:
function cs () { cd $1 ls }
जैसा कि @geirha corretly नोट करता है, उपरोक्त फ़ंक्शन विफल हो जाएगा यदि आप इसके नाम में किसी स्थान के साथ निर्देशिका में स्विच करने का प्रयास करते हैं:
$ cs A\ B/
-bash: cd: A: No such file or directory
<current directory listing>
आपको इसके बजाय निम्नलिखित फ़ंक्शन का उपयोग करना चाहिए:
function cs () {
cd "$@" && ls
}
एक बार जब आप उस कोड को अपने साथ जोड़ लेते हैं ~/.bashrc
, तो आपको ऐसा करने में सक्षम होना चाहिए:
hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$
आप builtin
कमांड को bash में उपयोग कर सकते हैं :
function cd() {
new_directory="$*";
if [ $# -eq 0 ]; then
new_directory=${HOME};
fi;
builtin cd "${new_directory}" && ls
}
function ls() { /usr/bin/ls $* }
cd
क्योंकि rvm
मेरी cd
परिभाषा भी बदलती है। देखें stackoverflow.com/a/19941991/1601989
एक उपनाम के बजाय एक फ़ंक्शन का उपयोग करें:
cs() { cd "$1" && ls; }
एक समारोह का उपयोग करने की नोक के लिए धन्यवाद फ्लोरियन डिस्च । मैं cs
नाम के रूप में उपयोग नहीं कर सकता क्योंकि csound पैकेज cs
में एक कमांड है , इसलिए मैंने उपयोग किया ।lc
मैंने इसे ~/.bash_aliases
( nano ~/.bash_aliases
) में जोड़ा :
function lc () {
cd $1;
ls
}
इसके reset
प्रभावी होने के लिए टर्मिनल का होना आवश्यक है ।
$1
ऐसे ही गैर उद्धृत इसे विफल कर देगा अगर निर्देशिका रिक्त स्थान हैं। इसके अलावा, आपको वापसी मूल्य की जांच करनी चाहिए cd
; अगर यह विफल रहा (जैसे अनुमति अस्वीकृत), तो चलाने का कोई मतलब नहीं है ls
। lc() { cd "$@" && ls; }
इस फ़ंक्शन के विस्तार के रूप में:, cs() { cd "$1" && ls; }
आप इस तरह के बजाय का cd
उपयोग करके फ़ंक्शन के सभी तर्कों को पारित करना चाह सकते हैं :।$@
"$1"
cs() { cd $@ && ls; }
मुझे पुनर्परिभाषित करने में समस्याएँ आई cd
क्योंकि rvm
मेरी cd
परिभाषा भी बदलती है। Https://stackoverflow.com/a/19941991/1601989 देखें । मैं वास्तव में उपयोग नहीं करना चाहता था builtin
क्योंकि जो कुछ भी rvm
कर रहा है उसे छोड़ देगा ।
मैंने निम्नलिखित को अपने साथ जोड़ा .bashrc
:
# cdd allows you to cd to the directory of the given file or directory
function cdd()
{
if [[ $# -eq 0 ]]; then
cd
elif [[ -d "$*" ]]; then
cd "$*"
elif [[ -f "$*" ]]; then
echo "WARNING: file given, cd to file's dirname" 1>&2
local dir=$(dirname "$*")
cd "$dir"
else
cd "$*"
fi
}
function cs()
{
cdd $* && ls
}
और फिर में rmv
लाइन के बाद .bashrc
:
alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd