ฉันจะป้องกันคำสั่ง 'cd' จากการไปที่โฮมไดเร็กตอรี่ได้อย่างไร?


10

สิ่งนั้นคือบางครั้งฉันพิมพ์cdโดยไม่ได้ตั้งใจและพาฉันไปที่โฮมไดเร็กตอรี่

เช่นฉันอยู่ในไดเรกทอรีที่มีไดเรกทอรีที่ซ่อนอยู่และไดเรกทอรีที่มองเห็นได้ฉันกดcd+ tabและพาฉันไปที่ไดเรกทอรีบ้าน


30
หากคุณcdอยู่ที่ไหนสักแห่งโดยอุบัติเหตุใช้cd -เพื่อกลับไปยังตำแหน่งก่อนหน้าของคุณ - ทุบตีเก็บ$OLDPWDตัวแปรสำหรับวัตถุประสงค์นี้ ดูgnu.org/software/bash/manual/bash.html#index-cd
glenn jackman

4
หากคุณไม่ต้องการcdทำสิ่งใดอย่างแท้จริงคุณสามารถเขียนฟังก์ชั่นชื่อcdที่ไม่ทำอะไรเลยเมื่อไม่ได้รับการโต้แย้งมิฉะนั้นเรียกbuiltin cd "$@"
เกล็นแจ็

2
ความคิดที่แย่จริงๆ: HOME =
Joshua

26
คำแนะนำที่ดีที่สุดของฉันคือการชะลอตัวและเรียนรู้ที่จะตรวจสอบคำสั่งก่อนที่คุณจะดำเนินการ ในคำอื่น ๆ : รับใช้ในcdการทำสิ่งที่มันทำ หากคุณยังคงนิสัยการรันคำสั่งที่คุณยังไม่ได้ตรวจสอบซ้ำคุณจะพบปัญหาที่ใหญ่กว่าในภายหลัง เช่นคุณต้องการย้ายสองไฟล์ลงในไดเรกทอรีที่สามmv a b dir/และ TAB เสร็จสิ้นไม่ได้ผลิตdirตามที่คุณคาดหวังว่าคุณจะจบลงการดำเนินการซึ่งเขียนทับmv a b bเรียนรู้ที่จะระมัดระวังเรียนรู้ที่จะดูคำสั่งก่อนกด Enter
egmont

1
@ Joe ผมเขียนสคริปต์เสื้อคลุมสำหรับrmการป้องกันไม่ให้ลบไดเรกทอรีระดับบนเช่น/, /etc, /usr, /home, /varฯลฯ โดยไม่ต้องแทนที่รหัสผ่าน บางครั้งเราต้องการการป้องกันจากตัวเราเอง :)
WinEunuuchs2Unix

คำตอบ:


14

ใช้gedit ~/.bashrcและแทรกบรรทัดเหล่านี้ที่ด้านล่าง:

cd() {
    [[ $# -eq 0 ]] && return
    builtin cd "$@"
}

เปิดเทอร์มินัลใหม่และตอนนี้เมื่อคุณพิมพ์cdโดยไม่มีพารามิเตอร์คุณก็ยังคงอยู่ในไดเรกทอรีเดียวกัน


TL; DR

หากคุณต้องการที่จะทำอย่างละเอียดคุณสามารถใส่ในหน้าจอความช่วยเหลือเมื่อไม่มีการส่งพารามิเตอร์:

$ cd

cd: missing operand

Usage:

    cd ~            Change to home directory. Equivelent to 'cd /home/$USER'

    cd -            Change to previous directory before last 'cd' command

    cd ..           Move up one directory level

    cd ../..        Move up two directory levels

    cd ../sibling   Move up one directory level and change to sibling directory

    cd /path/to/    Change to specific directory '/path/to/' eg '/var/log'

รหัสขยายเพื่อบรรลุสิ่งนี้คือ:

cd() {
    if [[ $# -eq 0 ]] ; then
        cat << 'EOF'

cd: missing operand

Usage:

    cd ~            Change to home directory. Equivelent to 'cd /home/$USER'

    cd -            Change to previous directory before last 'cd' command

    cd ..           Move up one directory level

    cd ../..        Move up two directory levels

    cd ../sibling   Move up one directory level and change to sibling directory

    cd /path/to/    Change to specific directory '/path/to/' eg '/var/log'

EOF
        return
    fi

    builtin cd "$@"
}

6
แต่คุณทำให้สภาพแวดล้อมของคุณเป็นเหมือนสภาพแวดล้อมอื่น ทำไมไม่เรียกใช้ฟังก์ชันncd(สำหรับ "New cd") และปล่อยให้cdอยู่คนเดียว
waltinator

@waltinator ฉันสามารถปรับปรุงคำตอบที่มีคำเตือนเกี่ยวกับวิธีการที่cd (ว่าง) ~/.bashrcทำงานแตกต่างกันสำหรับคนที่นอกเหนือจากผู้ใช้ที่บ้านของ คุณช่วยยกตัวอย่างหรือสองสิ่งที่ควรระวัง เช่นผู้พัฒนาใช้cd (ว่าง) ในสคริปต์การติดตั้ง (สมมุติ แต่ฉันไม่สามารถนึกถึงกรณี) ฉันสามารถม้วนขึ้นตัวอย่างของคุณให้เป็นคำตอบและแนะนำการใช้ OP ตลอดเวลาแทนncd cd
WinEunuuchs2Unix

ฉันรักการปรับแต่งสิ่งต่าง ๆ มันเกี่ยวกับลีนุกซ์ แต่ฉันมีกฎส่วนบุคคลที่เข้มงวดไม่เคยเปลี่ยนฟังก์ชั่น (ไม่มีปุนตั้งใจ) ของคำสั่งทั่วไป สิ่งนี้จะเปิดปัญหาเมื่อคุณทำงานในระบบอื่นหรือเมื่อมีคนอื่นทำงานหรือแนะนำคุณเกี่ยวกับตัวคุณ ฉันเห็นด้วยกับ @waltinator และคนอื่น ๆ "ดี" โจ
โจ

6

หากการทำแท็บเสร็จสมบูรณ์ซึ่งเป็นสาเหตุให้เกิดสิ่งนี้ตัวเลือกหนึ่งคือการทำให้วัฏจักรการทำให้เสร็จสมบูรณ์ผ่านรายการทันที สิ่งนี้สามารถทำได้โดยใช้ตัวเลือกreadlinemenu-compleแทนค่าเริ่มต้นcomplete:

bind 'tab: menu-completion'

จากนั้นในไดเรกทอรีบ้านของฉันตัวอย่างเช่น:

$ cd <tab> # becomes
$ cd .Trash

แน่นอนว่าคุณต้องอ่านสิ่งที่คุณกำลังดำเนินการอยู่


4

นี่คือวิธีที่ฉันใส่ dir ปัจจุบันและผู้ใช้ในชื่อ windows ของฉัน - คุณสามารถปรับให้เข้ากับความต้องการของคุณ แต่cd -เทียบเท่ากับcd $OLDPWDเป็นทางออกที่ดีกว่า

จากฉัน~/.bashrc:

# from the "xttitle(1)" man page - put info in window title
update_title()
{
    [[ $TERM = xterm ]] || [[ $TERM = xterm-color ]]  && xttitle "[$$] ${USER}@${HOSTNAME}:$PWD"
}

cd()
{
    [[ -z "$*" ]] && builtin cd $HOME
    [[ -n "$*" ]] && builtin cd "$*"
    update_title
}

4

ปัญหาที่นี่ไม่ได้cdและไม่ได้รับการแก้ไขโดยเทคโนโลยี

ปัญหาคือคุณและได้รับการแก้ไขโดยความอดทน!

หากคุณมักพบว่าตัวเองการพิมพ์และการส่งคำสั่งที่คุณไม่ได้ต้องการการปฏิบัติที่ชะลอตัวลง สูดลมหายใจอ่านสิ่งที่คุณกำลังพิมพ์และตรวจสอบอีกครั้งก่อนกด Enter ลองคิดดู อย่ารีบเร่ง

คุณจะพบว่าวิธีการนี้ไม่เพียง แต่แก้ปัญหาในมือ แต่ยังมีปัญหาอื่น ๆ อีกมากมายที่คุณกำลังประสบหากคุณดำเนินการตามเส้นทางปัจจุบันของคุณ


2
นอกจากนี้หลังจากใช้ไปหลายเดือน / ปีคุณจะลืมไปว่าคุณเปลี่ยนพฤติกรรมและจะมีปัญหาในการทำงานในสภาพแวดล้อมอื่น
pLumo

@RoVo นั่นก็เป็นจุดที่ดีด้วย!
การแข่งขัน Lightness ใน Orbit

@RoVo ที่สามารถเกิดขึ้นได้ในไม่กี่วัน ทันทีหากคุณบูตดูอัลสลับไปยัง VM ...
Joe

@ Joe เมื่อเร็ว ๆ นี้ฉันได้สลับไปมาระหว่าง OSX ในเวลากลางวันและ Windows ในตอนเย็นและการเปลี่ยนรูปแบบแป้นพิมพ์ทำให้สับสนจริงๆ !
Lightness Races ในวงโคจร

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