बैश निर्देशिका शॉर्टकट


28

जब मैं टाइप करता हूं cd ~foo, तो मुझे fooपूरी निर्देशिका पथ टाइप करने के लिए शॉर्टकट के रूप में मुझे कुछ निर्देशिका में ले जाना पसंद है foo। और मैं डाइरेक्टरी से होम डाइरेक्टरी की cp ~foo/bar.txt ~/bar.txtफाइल कॉपी करने में सक्षम होना चाहूंगा /foo/... इसलिए मूल रूप से, मैं कुछ ऐसा चाहता हूं, जो बिल्कुल वैसा ही ~/काम करता हो, लेकिन मैं यह निर्दिष्ट करता हूं कि डायरेक्टरी क्या होनी चाहिए। [मुझे यकीन है कि मुझे jfgi चाहिए, लेकिन मुझे नहीं पता कि fg क्या है]


zsh ने इसके लिए बिल्ट-इन सपोर्ट दिया है। इसे " नामित निर्देशिका " कहा जाता है
सिल्डोरेथ

मैं बहुत लंबे समय से कुछ शेल-बुकमार्किंग टूल की तलाश में था, और आखिरकार मैं अपने स्वयं के (फजी-खोज-आधारित) समाधान के साथ समाप्त हो गया हूं जो मुझे और अधिक पसंद है जो मैंने पहले देखा है। इस उत्तर की जाँच करें: unix.stackexchange.com/a/209892/46011
दिमित्री फ्रैंक

जवाबों:


39

जिस तरह से मैं यह करता था वह एक निर्देशिका बनाने के लिए है जिसमें उन निर्देशिकाओं के प्रति सहानुभूति होती है जो आप शॉर्टकट चाहते हैं, और उस निर्देशिका को अपने CDPATH में जोड़ें। CDPATH नियंत्रित करता है कि cdआप निर्देशिकाओं को स्विच करते समय कहां खोज करेंगे, इसलिए यदि सहानुभूति की वह निर्देशिका आपके CDPATH में है, तो आप cdकिसी भी सहानुभूति निर्देशिका को तुरंत कर सकते हैं:

mkdir ~/symlinks
ln -s /usr/bin ~/symlinks/b
export CDPATH=~/symlinks
cd b   # Switches to /usr/bin

निश्चित रूप से नकारात्मक पक्ष यह नहीं होगा यदि आपकी वर्तमान निर्देशिका में "b" नाम की कोई निर्देशिका है - जो CDPHH पर पूर्वता लेता है


मैं आम तौर पर उन उत्तरों को नापसंद करता हूं जो कहते हैं कि "पहले आपको गोले स्विच करने की आवश्यकता है", लेकिन यह सटीक सुविधा ज़ैस में मौजूद है , यदि आप इसके बजाय उपयोग करने के लिए तैयार हैं; इसे निर्देशिका नाम दिया गया है । आप एक चर निर्यात करते हैं foo, और जब आप ~fooइसे संदर्भित करते हैं तो मूल्य के अनुसार हल होता है $foo। यह विशेष रूप से सुविधाजनक है क्योंकि यह इसके अलावा कमांड में काम करता है cd:

echo hi > /tmp/test
export t=/tmp
cat ~t/test   # Outputs "hi"

2
यह ZSH फीचर किन तरीकों से करता है: echo hi> / tmp / test; export t = / tmp; बिल्ली $ t / परीक्षण कम से कम मेरी मशीन पर, यह ठीक काम करता है। फर्क सिर्फ इतना है कि आपको टाइप करना है।
स्टीवन डी

ऑप को ज़श का हवाला देना सही बात है। मैंने 15 साल में एक बार उस सुविधा को याद नहीं किया है। ऐसा लगता है कि जिस तरह से कुछ लोग वास्तव में जुनूनी हो जाते हैं, जबकि अन्य परवाह नहीं करते हैं। इसलिए एक से अधिक शैल हैं।

2
@Steven यह बहुत समान है, लेकिन ZSH जानता है कि यह इस मामले में एक नामित निर्देशिका है, इसलिए इसमें यह शीघ्र विस्तार में विशेष रूप से इलाज और खोल सकते हैं में निर्मित आदेशों
माइकल Mrozek

[मैं ज्यादातर एमएसीएस शेल का उपयोग करके ऐसा कर रहा हूं (क्योंकि जब मैं टर्मिनल का उपयोग करता हूं), मुझे लगता है कि जेडएसई समाधानों को नियमबद्ध करता है] ...
सीमस

1
इसे मेरे .zshrc में जोड़ा और वह काम कर गया।
सीवस

10

आप इसके लिए एक रैपर फ़ंक्शन लिख सकते हैं cdऔर इसे "सीडी" कह सकते हैं (अंततः फ़ंक्शन कॉल करेगा builtin cd- builtinकीवर्ड का उपयोग करके )। आप एक उपसर्ग वर्ण का उपयोग कर सकते हैं, जो आपके फ़ंक्शन को देखने से पहले बाश कमांड लाइन पर विस्तार नहीं करेगा और यह आपके निर्देशिका नामों में प्रारंभिक चरित्र के रूप में प्रकट होने की संभावना नहीं है, शायद ":"। आप इसे और अधिक मजबूत बनाना चाहते हैं, लेकिन यहाँ एक सरल रूपरेखा है:

# format: [semicolon] shortcut colon destination [semicolon] ...
export CDDATA='foo:/path/to/foo;bar:/path/to/bar;baz:/path/to/baz'

cd () {
    local dest=$1
    if [[ $dest == :* ]]
    then
        [[ $CDDATA =~ (^|;)${dest:1}:([^;]*)(;|$) ]]
        dest=${BASH_REMATCH[2]}
    fi
    if [[ -z $dest ]]
    then
        cd
    else
        builtin cd "$dest"
    fi
}

cd :bar    # pwd is now /path/to/bar

1
यह एक बहुत अच्छा विचार है
माइकल Mrozek

इस सुझाव के लिए धन्यवाद - इसके शीर्ष पर मेरा वास्तव में सरल समाधान बनाया: aaverin.github.io/unix/macox/2014/05/26/bash-onym-folders
AAverin

7

बैश के साथ:

~fooउपयोगकर्ता फू के घर निर्देशिका के लिए आरक्षित है। मैं केवल उस सुविधा के लिए उपयोगकर्ता बनाने की अनुशंसा नहीं करूंगा।

परिवेश चर (इसे ऊपर देखो ) सेट करके निर्देशिकाओं को बदलते समय आप अपने जीवन को आसान (या कठिन) बना सकते हैं ।CDPATHbash(1)

इसके अलावा, सोचने का एकमात्र तरीका उन निर्देशिकाओं के लिए पर्यावरण चर सेट करना होगा जिन्हें आप संक्षिप्त करना चाहते हैं।

$ FOODIR=/var/lib/misc
$ cp ~/bar.txt $FOODIR

2

बुकमार्क सिस्टम बनाने के लिए बैश वेरिएबल्स का उपयोग किया जा सकता है। चर किसी भी आदेश के साथ काम करेंगे और बैश चर नाम पूरा करेंगे। बैश के नए संस्करणों में, यदि a / को वैरिएबल नाम से जोड़ा जाता है, तो वैरिएबल पथ में टैब को भी पूरा किया जा सकता है।

mydir=/home/chris/dir
ls $my         # Tab completion works on variable name.
ls $mydir/     # Tab completion is equivalent to that with ls /home/chris/dir/
               # (doesn't work in older versions of bash).

दृढ़ता के लिए, चर घोषणाओं को एक फ़ाइल में रखा जा सकता है जो .bashrc से ली गई है। चूँकि यह फ़ाइल एक बैश स्क्रिप्ट है, इसमें ऐसी घोषणाएँ हो सकती हैं, जो अन्य चर जैसे संदर्भ aur="${HOME}/AUR", या केवल कुछ मेजबानों पर चलती हैं if [[ $HOSTNAME == foo ]]; then bar=baz; fi, जो कई होस्ट और उपयोगकर्ताओं के लिए कॉन्फ़िगर की गई फ़ाइलों का पुन: उपयोग करने पर उपयोगी होती हैं।

निम्न बैश फ़ंक्शन (इसे .bashrc में जोड़ा जाना चाहिए, या इसमें से सॉरी किया गया है) बुकमार्क को बुकमार्क फ़ाइल से जोड़ा और हटाया जा सकता है। यह काफी नया है और बग्स से मुक्त होने की गारंटी नहीं है।

bookmark_file=~/.bookmarks
source "$bookmark_file"

bm() {
usage='Usage:
bm add <name> <path>           Create a bookmark for path.
bm add <name>                  Create a bookmark for the current directory.
bm update                      Source the bookmark file.
bm remove <name>               Remove a bookmark'              

case $1 in
    add)
        local path
        if [[ $# -eq 2 ]]; then
            path=.
        elif [[ $# -eq 3 ]]; then
            if [[ -e $3 ]]; then
                path="$3"
            else
                echo "bm: ${3}: No such file or directory."
                return 1
            fi               
        else
            echo "$usage"
            return 1
        fi

        if declare | grep "^${2}=" > /dev/null; then
            echo "bm: The name $2 is in use."
            return 1
        fi
        path=$(readlink -f "$path")
        echo ${2}=\""$path"\" >> "$bookmark_file"
        eval ${2}=\""$path"\"
        return 0
        ;;
    update)
        if [[ $# -eq 1 ]]; then
            source "$bookmark_file"
            return 0
        fi
        ;;
    remove)
        if [[ $# -eq 2 ]]; then
            unset $2
            local contents=$(grep -v "^${2}=" "$bookmark_file")
            echo "$contents" > "${bookmark_file}.tmp"
            rm -f "$bookmark_file"
            mv "${bookmark_file}.tmp" "$bookmark_file"
            return 0
        fi
        ;;
esac

echo "$usage"
return 1
}

0

एक रास्ता cd के लिए एक उपनाम बनाना होगा जो ~cवांछित पथ को प्रतिस्थापित करता है। या बस zsh का उपयोग करें;)


2
हां, मैंने ऐसा करने के बारे में सोचा, जैसे कि अलियास ~ सी = "सीडी / डेटेन / सीवीएस / प्लगइन_प्रोट" लेकिन वह केवल सीडी के साथ मदद करता है, जबकि नामित निर्देशिकाओं का उपयोग हर कमांड के साथ किया जा सकता है।
fschmitt


0

मेरे पास नीचे का फंक्शन है जो फ्लाई पर उर्फ ​​बनाएगा,

s () {
    if [[ "x$1" != "x" ]]
    then
        alias $1="cd $PWD;pwd"
        echo "alias $1=\"cd $PWD;pwd\""
    else
        echo "Usage: s[s] <directory bookmark name>"
        return 1
    fi
}

जब मैं एक निर्देशिका को बुकमार्क करना चाहता हूं, तो मैं टाइप करता हूं s dirName। यह एक उपनाम की तरह बनाता है alias dirName="cd /my/current/directory/;pwd"। इसलिए मैं केवल टाइप करके इस निर्देशिका में वापस आ सकता हूं dirName। मेरे पास एक संस्करण है जो इसे bash_aliases में भी बचाता है। यह किसी भी शेल में काम करता है।

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