ทำให้ cd เป็น ls โดยอัตโนมัติ


46

ฉันพบว่าฉันมักจะทำต่อไปนี้:

%> cd bla/bla
%> ls

ฉันจะชอบมันที่ว่าเมื่อใดก็ตามที่ฉันในไดเรกทอรีที่มันไม่โดยอัตโนมัติcdls

ฉันเล่นซอกับฉันซัก.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เมื่อคุณทำงานกับผู้ดูแลระบบอื่น ๆ ) มันอาจเป็นอันตรายอย่างยิ่งที่จะแทนที่คำสั่งที่มีอยู่เนื่องจากสภาพแวดล้อมนั้นแตกต่างจากที่คนคาดหวัง


คำสั่งนั้นเปลี่ยนไดเรกทอรีจริงเหรอ? จาก man page ของ bash: "ไม่มีกลไกสำหรับใช้อาร์กิวเมนต์ในข้อความแทนที่ถ้าจำเป็นต้องใช้อาร์กิวเมนต์ควรใช้ฟังก์ชัน shell"
enzotib

@enzotib: ใช่มันจะเปลี่ยนไดเรกทอรีจริง ๆ อย่างน้อยก็สำหรับฉัน pwdฉันปรับปรุงคำตอบของฉันเพื่อแสดงการส่งออกของ ไม่แน่ใจว่านี่เป็นวิธีปฏิบัติที่ดีที่สุดหรือไม่ แต่เป็นเรื่องปกติ ดูตัวอย่างtldp.org/LDP/abs/html/aliases.html
Stefan Lasiewski

2
ครั้งแรก: มันไม่ทำงานที่นี่ ที่สอง: ในหน้านั้นพวกเขาใช้ตัวแปรไม่ใช่พารามิเตอร์ตำแหน่ง ประการที่สาม: ABS เป็นแหล่งของการปฏิบัติที่ไม่ดี
enzotib

1
นามแฝงใช้งานได้กับ Snow Leopard แต่ไม่ใช่ใน CentOS5 หรือ CentOS6 ฉันอัปเดตคำตอบเพื่อใช้ฟังก์ชั่นเท่านั้น ไม่มีนามแฝง
Stefan Lasiewski

1
ใช้งานไม่ได้สำหรับฉัน พยายามตอบคำสั่ง @frabjous แล้วและใช้งานได้: cd() { builtin cd "$@" && pwd; };- ใช้เชลล์ bourne มาตรฐานบน macOS (Sierra 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(ตัวแปรพร้อมต์แบบโต้ตอบ) เป็น "zero length" (-z) หรือไม่ หากความยาวเป็นศูนย์หมายความว่าไม่ได้ตั้งค่าไว้ดังนั้น Bash จะต้องไม่ทำงานในโหมดโต้ตอบ && returnส่วนหนึ่งออกจากการจัดหา.bashrcที่จุดนี้ภายใต้เงื่อนไขเหล่านี้
frabjous

1
วิธีการตรวจสอบสำหรับการติดต่อสื่อสารก็คือการมองหาiใน:"$-" case "$-" in *i*) ;; *) return ;; esac
Kusalananda

@ Kusalananda & frabjous: มีกรณีที่ควรใช้อย่างใดอย่างหนึ่งแทนอื่น ๆ ?
หมุน

1
@Swivel PS1ตัวแปรอาจไม่ได้ตั้งค่าหรือว่างเปล่าและเชลล์อาจยังคงทำงานอยู่ (แต่ไม่มีพรอมต์) ฉันจะตรวจสอบ$-เพื่อให้แน่ใจ
Kusalananda

13

นอกหัวข้อเนื่องจากคำถามถูกติดแท็ก / bash แต่เนื่องจากคำถามบางคำถามถูกปิดเหมือนของคำถามนี้ที่ไม่ได้กล่าวถึง bash:

ด้วย zsh:

chpwd() ls

ฟังก์ชั่น chpwd () ถูกเรียกโดย zsh เมื่อใดก็ตามที่ไดเรกทอรีปัจจุบันเปลี่ยนแปลง (โดยวิธี cd, pushd, popd ... ) tcsh มีคุณสมบัติที่คล้ายกันและน่าจะเป็นที่ zsh ได้มาจาก


4

ทำไมไม่เพิ่มชื่อแทนลงในไฟล์. bashrc ของคุณ

สิ่งที่ต้องการ:

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

@don_crissti งานศพและนามแฝงนั้นต่างออกไป ดังนั้นทำไมไม่
Jodka Lemon

นี่เป็นวิธีที่รวดเร็วและสะอาดที่สุดในการทำสิ่งที่ OP ขอ ในความคิดของฉันฟังก์ชั่นควรจะใช้สำหรับสิ่งที่ซับซ้อนมากขึ้นในขณะที่การทำทางลัดสำหรับคำสั่งที่พิมพ์มักจะเป็นสิ่งที่นามแฝงอยู่
Ghos3t

ฉันมีปัญหาแปลกกับนามแฝงนี้เมื่อฉันใช้มันเช่นนี้ cdls projec2 มันจะแสดงไฟล์ทั้งหมดในโฟลเดอร์โครงการ 2 แต่ไม่จริง cd ไปยังโฟลเดอร์นั้น แต่มันจะยังคงอยู่ในโฟลเดอร์เดิม
Ghos3t

2

โซลูชันทั่วไปของการสร้างนามแฝงสำหรับคำสั่ง cd นั้นไม่สมบูรณ์เพราะมีคำสั่งอื่น ๆ ที่สามารถเปลี่ยนไดเรกทอรีปัจจุบันของคุณเช่น popd หรือแม้แต่เรียกใช้สคริปต์ด้วยคำสั่ง cd ในนั้น

เป็นการดีกว่าที่จะใช้ $ PROMPT_COMMAND Bash hook ซึ่งดำเนินการคำสั่งก่อนที่จะส่งคืนพรอมต์

คำสั่ง (ฟังก์ชั่นในกรณีของเรา) จะดำเนินการ ls เฉพาะในกรณีที่ไดเรกทอรีมีการเปลี่ยนแปลงเพื่อลดเสียงรบกวนหน้าจอ รหัสสำหรับ. 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

2

คัดลอกนี้:

altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd 

ตอนนี้คุณสามารถทำซีดีง่าย ๆ :

cd / 
(files listed)
cd /home 
(files listed)
etc... 

1

ในทุบตีคุณไม่สามารถเกิดขึ้นอีกครั้งเพื่อนามแฝงสำหรับการกระทำที่ต้องใช้พารามิเตอร์ สำหรับเรื่องนี้มีฟังก์ชั่น ดังนั้นใส่ใน~/.bashrcสิ่งต่อไปนี้ของคุณ

mycd() {
  cd "$1"
  ls
}


เพื่อให้พารามิเตอร์สำหรับคำสั่ง ls ฉันใช้ function mycd {builtin cd $ 1 && ls $ 2} ตอนนี้คุณสามารถเรียกใช้คำสั่งเช่น mycd .. -la
Christian Schulzendorff

@ChristianSchulzendorff: function mycd { builtin cd "$1" && ls "$2" } ดีกว่าการใช้คำพูด:
enzotib

ใช้งานไม่ได้ฉันลองแล้ว ไฟล์ว่างเปล่า แต่หลังจากเพิ่มรหัสของคุณแล้วจะไม่มีอะไรเปลี่ยนแปลง
Black

0

วางรหัสด้านล่างใน. profile และใช้งานได้ ทดสอบในกล่อง HP-Unix

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ส่งออก ที่จะกลับไปในประวัติศาสตร์ dirs เพียง pop popdคำสั่งนี้:

ฉันเพิ่มelseดังนั้นคุณจะเห็นข้อผิดพลาดเมื่อพยายามไปที่ไดเรกทอรีผิด


ถ้าคุณเพียงแค่ทำซีดี - มันจะนำคุณไปยังผบสุดท้ายของคุณว่าคุณอยู่ใน.
เอียน

0

ฉันคิดว่าเป็นการดีที่จะเปิดใช้งานlsตัวเลือกด้วยวิธีนี้เนื่องจากcdไม่มีตัวเลือก

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

อืมมม ... cdใช้ตัวเลือก
Kusalananda

0

นี่คือสิ่งที่ฉันพบว่ามีประโยชน์ (บน Debian 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'

นี่เป็นการเพิ่มอะไรที่คำตอบอื่น ๆ ยังไม่ได้กล่าวถึง
jasonwryan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.