सीडी स्वचालित रूप से एलएस करें


46

मुझे लगता है कि मैं अक्सर निम्नलिखित कार्य करता हूं:

%> cd bla/bla
%> ls

मुझे यह पसंद है कि जब भी मैं cdएक निर्देशिका में यह स्वचालित रूप से एक करता है ls

मैंने .bashrcथोड़ी देर के लिए अपने साथ काम किया , लेकिन यह पता नहीं लगा सका कि यह कैसे होता है।

जवाबों:


50

आप इसे एक फ़ंक्शन के साथ कर सकते हैं:

$ cdls() { cd "$@" && ls; }

&&का अर्थ है ' cdएक निर्देशिका करने के लिए, और सफल (जैसे निर्देशिका मौजूद है) है, रन ls'। &&ऑपरेटर का उपयोग करना बेहतर है और फिर ;दो कमांड के बीच में अर्धविराम ऑपरेटर का उपयोग करना { cd "$@" ; ls; }। यह दूसरा आदेश lsभले ही cdकाम करे या न चले । यदि cdविफल हुआ, lsतो आपकी वर्तमान निर्देशिका की सामग्री को प्रिंट करेगा, जो उपयोगकर्ता के लिए भ्रामक होगा। एक सर्वोत्तम अभ्यास के रूप में, उपयोग करें &&और नहीं ;

$ cdls /var/log
CDIS.custom     fsck_hfs.log    monthly.out     system.log
$ pwd
/var/log

सामान्य तौर पर, यह एक कमांड का नाम बदलने के लिए एक बुरा अभ्यास है जो पहले से मौजूद है, विशेष रूप से आमतौर पर कहे जाने वाले कमांड जैसे cd। इसके बजाय, एक अलग नाम के साथ एक नया कमांड बनाएं। यदि आप cdकिसी फ़ंक्शन या उपनाम के साथ ओवरराइट करते हैं जिसका नाम भी है cd, तो जब आप 100,000 फ़ाइलों के साथ एक निर्देशिका में प्रवेश करते हैं तो क्या होगा? कई उपयोगिताओं हैं जो उपयोग करते हैं cd, और वे इस असामान्य व्यवहार से भ्रमित हो सकते हैं। यदि आप एक साझा खाते का उपयोग करते हैं (जैसे कि rootजब आप अन्य सिस्टम प्रशासक के साथ काम कर रहे हैं), तो यह मौजूदा कमांड को बदलने के लिए बहुत खतरनाक हो सकता है क्योंकि वातावरण लोगों की अपेक्षा से अलग है।


वह कमांड वास्तव में डायरेक्टरी बदल देता है? बैश के मैन पेज से: "प्रतिस्थापन पाठ में तर्कों का उपयोग करने के लिए कोई तंत्र नहीं है। यदि तर्क की आवश्यकता है, तो एक शेल फ़ंक्शन का उपयोग किया जाना चाहिए"
enzotib

@enzotib: हां, यह वास्तव में निर्देशिका को बदलता है, कम से कम मेरे लिए। के आउटपुट को दिखाने के लिए मैंने अपना उत्तर अपडेट किया pwd। यकीन नहीं होता कि यह सबसे अच्छा अभ्यास है, लेकिन यह आमतौर पर किया जाता है। कुछ उदाहरणों के लिए tldp.org/LDP/abs/html/aliases.html देखें ।
स्टीफन लासिवस्की

2
पहला: यहां काम नहीं होता। दूसरा: उस पेज में वे वैरिएबल का उपयोग करते हैं, न कि पोजिशनल मापदंडों का। तीसरा: एबीएस बुरी प्रथाओं का एक आम स्रोत है।
19

1
उपनाम मेरे लिए स्नो लेपर्ड पर काम करता है लेकिन CentOS5 या CentOS6 पर नहीं। मैंने केवल एक फ़ंक्शन का उपयोग करने के लिए अपना उत्तर अपडेट किया। कोई उपनाम नहीं।
स्टीफन लासिवस्की

1
मेरे लिए काम नहीं करता है। @Frabjous जवाब की कोशिश की और यह काम करता है: cd() { builtin cd "$@" && pwd; };- MacOS (सिएरा 10.12.6) पर मानक बॉर्न शैल का उपयोग कर
फिरकी

39

मेरे पास मेरे .bashrc में है, और यह ठीक काम करता है।

function cd {
    builtin cd "$@" && ls -F
    }

इससे पहले मेरे .bashrc में मेरे पास है: [ -z "$PS1" ] && returnऔर उस लाइन के बाद सब कुछ केवल इंटरैक्टिव सत्रों पर लागू होता है, इसलिए यह प्रभावित नहीं करता है कि cdलिपियों में कैसे व्यवहार होता है।


1
वास्तव में क्या करता [ -z "$PS1" ] && returnहै?
Syntagma

2
[ -z "$PS1" ]जाँच करता है कि $PS(इंटरेक्टिव प्रॉम्प्ट वेरिएबल) "शून्य लंबाई" (-z) है। यदि यह शून्य लंबाई है, तो इसका मतलब यह सेट नहीं किया गया है, इसलिए बैश को इंटरैक्टिव मोड में नहीं चलना चाहिए। && returnभाग सोर्सिंग से बाहर निकल जाता है .bashrcइन परिस्थितियों में, इस बिंदु पर।
frabjous

1
अन्तरक्रियाशीलता के लिए जाँच करने के लिए एक और तरीका है देखने के लिए है iमें "$-": case "$-" in *i*) ;; *) return ;; esac
Kusalananda

@ कुसलानंद और भड़काऊ: क्या ऐसे मामले हैं जहां एक को दूसरे के बजाय इस्तेमाल किया जाना चाहिए?
फिरकी

1
@Swivel PS1परिवर्तनशील या खाली हो सकता है और शेल अभी भी संवादात्मक हो सकता है (लेकिन एक संकेत के बिना)। मैं $-यह सुनिश्चित करने के लिए जाँच करूँगा ।
Kusalananda

13

ऑफ-टॉपिक, चूंकि प्रश्न टैग / बैश है, लेकिन जैसे ही कुछ प्रश्न इस के डुप्लिकेट के रूप में बंद हो जाते हैं, जो बैश का उल्लेख नहीं करते हैं:

Zsh के साथ:

chpwd() ls

Chpwd () फ़ंक्शन को zsh द्वारा बुलाया जाता है जब भी वर्तमान निर्देशिका बदलती है (cd, pushd, popd ... के माध्यम से)। tcsh में एक समान विशेषता है और संभवत: जहां zsh इसे मिला है।


4

अपने .bashrc फ़ाइल में कोई अन्य उपनाम क्यों न जोड़ें?

कुछ इस तरह:

alias cdls='cd "$@" && ls'

@don_crissti एक मज़ा और एक उपनाम अलग चीजें हैं। तो क्यों नहीं?
जोडका लेमन

यह ओपी के लिए क्या करने का सबसे तेज और साफ तरीका है। मेरी राय में, अधिक जटिल चीजों के लिए फ़ंक्शंस का उपयोग किया जाना चाहिए, जबकि अक्सर टाइप किए गए आदेशों के लिए शॉर्टकट बनाना वास्तव में एलियंस के लिए मौजूद है।
Ghos3t

मुझे इस उपनाम के साथ एक अजीब समस्या हो रही है, जब मैं इसे इस तरह से उपयोग करता हूं, तो cdls projec2, यह प्रोजेक्ट 2 फ़ोल्डर में सभी फाइलें दिखाएगा लेकिन वास्तव में उस फ़ोल्डर में सीडी नहीं है, इसके बजाय, यह मूल फ़ोल्डर में रहेगा।
Ghos3t

2

सीडी कमांड के लिए उपनाम बनाने का सामान्य समाधान सही नहीं है क्योंकि अन्य कमांड हैं जो आपकी वर्तमान निर्देशिका जैसे पॉप को बदल सकते हैं या यहां तक ​​कि इसमें सीडी कमांड के साथ स्क्रिप्ट चला सकते हैं।

$ PROMPT_COMMAND बैश हुक का उपयोग करना बेहतर है जो एक प्रॉम्प्ट वापस करने से पहले एक कमांड निष्पादित करता है।

कमांड (हमारे मामले में एक फ़ंक्शन) केवल तभी एलएस निष्पादित करेगा जब स्क्रीन शोर को कम करने के लिए निर्देशिका बदल गई हो। कोड .bashrc के लिए:

    #each console has its own file to save PWD
    PrevDir=$(tty) 
    PrevDir=/tmp/prev-dir${PrevDir////-}
    #don't ls when shell launched
    echo $PWD > $PrevDir
    LsAfterCd() {
        [[ "$(< $PrevDir)" == "$PWD" ]] && return 0

        ll --color=always | sed 1d

        echo $PWD > $PrevDir
    }
    PROMPT_COMMAND=LsAfterCd


1

बैश में आप कार्रवाई के लिए उपनामों की पुनरावृत्ति नहीं कर सकते जिन्हें पैरामीटर की आवश्यकता होती है। इसके लिए कार्य हैं। तो अपने ~/.bashrcनिम्नलिखित में डाल दिया

mycd() {
  cd "$1"
  ls
}


Ls कमांड के लिए एक पैरामीटर की अनुमति देने के लिए, मैं फंक्शन mycd {बिल्टिन cd $ 1 && ls $ 2} का उपयोग करता हूं। अब आप कमांड को कॉल कर सकते हैं जैसे mycd .. -la
क्रिश्चियन

@ChristianSchulzendorff: उद्धरण का उपयोग करना बेहतर है function mycd { builtin cd "$1" && ls "$2" } :।
enzotib

काम नहीं करता, मैंने सिर्फ कोशिश की। फ़ाइल खाली थी, लेकिन आपके कोड को जोड़ने के बाद, कुछ भी नहीं बदला।
काला

0

नीचे दिए गए कोड को .profile में रखें और यह काम करता है। एचपी-यूनिक्स बॉक्स पर परीक्षण किया गया।

cdl()
{
if [ "$#" = 0 ]; then
cd ~ && ls -ltr
elif [ -d "$@" ]; then
cd "$@" && ls -ltr
else
echo "$@" directory not found!!!
fi
}

#SET YOUR ALIAS TO CD
alias cd="cdl"

0

और भी आसान - इतिहास में वापस जाने की क्षमता के साथ :

function cd() {
    if [ -d "$@" ]; then
        echo -n "Stack: "
        pushd "$@"
        ls
    else
        builtin cd "$@"
    fi
}
function popd() {
    builtin popd "$@" && ls
}

जब आप निर्देशिका को एक पंक्ति में बदलते हैं: Stack: (current_dir) (previous_dir) ...तब दिखाया जाएगा, तब lsआउटपुट। इतिहास में वापस जाने के लिए बस इस कमांड को पॉप करें popd:।

मैंने जोड़ा elseताकि गलत निर्देशिका में जाने का प्रयास करने पर आपको एक त्रुटि दिखाई दे।


अगर आप सिर्फ cd करते हैं - यह आपको आपके अंतिम डायर पर ले जाएगा, जिसमें आप थे।
इयान

0

मुझे लगता है कि lsइस तरह से विकल्पों को सक्षम करना अच्छा है क्योंकि cdकोई विकल्प नहीं है।

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}

उम्म ... cdविकल्प लेता है।
Kusalananda

0

यहाँ मैं उपयोगी है (डेबियन 9 पर):

c() {
    cd "${@}" \
    && ls --color=always -C \
    | sed '
        # on line 5, print the line,
        5 {
            # append an ellipsis
            a[...]
            # and quit
            q
        }
        # print lines 1-4 verbatim
    '
}

यह मुझे एक दीर्घवृत्त के साथ छोटा आउटपुट देता है यदि उस निर्देशिका में बहुत अधिक आइटम हैं, ताकि कंसोल आपके पास रहे:

$ c data/git/buildroot/package/
4th                              lua-markdown
a10disp                          lua-messagepack
acl                              lua-msgpack-native
acpica                           luaossl
acpid                            lua-periphery
[...]
$ ls -1 | wc --lines
1977

-1
alias cd='builtin cd $1 && ls -l && builtin cd $1'

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