ฉันจะสร้างนามแฝงสำหรับ cd และ ls ได้อย่างไร


32

ฉันมักจะเรียกใช้lsคำสั่งหลังจากใช้cdคำสั่ง ฉันจะสร้างนามแฝง (เช่นcs) สำหรับการดำเนินการนี้ได้อย่างไร

คำตอบ:


35

จากBash Tips and Tricks: 'cd' with style :

ในที่สุดฉันต้องการแสดงวิธีเขียนแทนแบบกำหนดเองของคุณสำหรับคำสั่ง 'cd'

คุณพบว่าตัวเองพิมพ์สิ่งเดียวกันเสมอเมื่อเปลี่ยนเป็นไดเรกทอรีหรือไม่? อย่างน้อยคุณอาจแสดงรายการไฟล์ที่นั่นทุกครั้งบางทีมือของคุณจะพิมพ์ 'ls' โดยอัตโนมัติหลังจาก 'cd' ทุกครั้ง

ด้วยการพยายามทุกวิถีทางที่ฉันสามารถนึกได้มันเป็นวิธีเดียวที่จะบรรลุเป้าหมายที่เรากำลังมองหา เราต้องสร้างฟังก์ชั่นเชลล์

ฟังก์ชั่นเชลล์เป็นส่วนหนึ่งของการเขียนโปรแกรมเชลล์ เช่นเดียวกับในการเขียนโปรแกรมภาษารวบรวมฟังก์ชั่นให้เรียงลำดับของ modularizability ขั้นตอน หนึ่งสามารถสร้างฟังก์ชั่นทั่วไปเพื่อดำเนินการตรรกะหรือการคำนวณที่ใช้บ่อยกับพารามิเตอร์ที่แตกต่างกัน ในกรณีนี้พารามิเตอร์เป็นไดเรกทอรีการทำงานปัจจุบัน

นี่คือตัวอย่างง่ายๆ:

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$

1
นั่นจะล้มเหลวสำหรับไดเรกทอรีที่มีช่องว่าง ดูความคิดเห็นต่อคำตอบของ dv3500ea
geirha

24

คุณสามารถใช้builtinคำสั่งใน bash:

function cd() {
    new_directory="$*";
    if [ $# -eq 0 ]; then 
        new_directory=${HOME};
    fi;
    builtin cd "${new_directory}" && ls
}

2
นี่มันค่อนข้างเนียน ฉันมีวิธีแก้ปัญหาคล้ายกับ @Florian ใน. bashrc เป็นเวลานาน แต่สิ่งนี้เป็นที่น่าพอใจมากขึ้นเมื่อฉันลืมว่าเพื่อนร่วมงานไม่มีชื่อแทน 'cs' บนคอมพิวเตอร์
dino

ฉันชอบคำตอบนี้ดีที่สุด ด้วยเหตุผลบางอย่างคุณไม่สามารถใช้นามแฝงเพื่อเขียนทับคำสั่งดังนั้นคุณต้องสร้างฟังก์ชันเหมือนกับคำตอบนี้ : D
trusktr

แต่สิ่งที่เกี่ยวกับคำสั่งที่ไม่ใช่ builtin? ตัวอย่างข้างต้นใช้ไม่ได้กับการเขียนทับคำสั่ง ls มีคำหลักที่ใช้แทน "builtin" หรือไม่?
trusktr

ใช้เส้นทางแบบเต็มของมันตัวอย่าง:function ls() { /usr/bin/ls $* }
OneOfOne

ฉันมีปัญหาในการกำหนดใหม่cdเนื่องจากrvmเปลี่ยนcdนิยามของฉันด้วย ดูstackoverflow.com/a/19941991/1601989
DavidG

16

ใช้ฟังก์ชั่นแทนนามแฝง:

cs() { cd "$1" && ls; }

5
+1 เนื่องจากเวอร์ชันนี้จะหยุดทำงานหาก 'cd' ล้มเหลว
htorque

9

ขอบคุณFlorian Dieschสำหรับเคล็ดลับการใช้ฟังก์ชั่น ฉันไม่สามารถใช้csเป็นชื่อที่เพราะมีcsคำสั่งในcsoundlcแพคเกจดังนั้นผมจึงใช้

ฉันเพิ่มลงใน~/.bash_aliases( nano ~/.bash_aliases):

function lc () {
    cd $1;
    ls 
}

เทอร์มินัลจำเป็นต้องมีresetสิ่งนี้เพื่อให้เกิดผล


8
การไม่มี$1เครื่องหมายอัญประกาศเช่นนี้จะทำให้ล้มเหลวหากไดเรกทอรีมีช่องว่าง นอกจากนี้คุณควรตรวจสอบค่าตอบแทนของcd; ถ้ามันล้มเหลว (เช่นอนุญาตปฏิเสธ) lsมีจุดในการทำงานไม่มี lc() { cd "$@" && ls; }
geirha

1

ขณะที่การขยายตัวฟังก์ชั่นนี้: cs() { cd "$1" && ls; }คุณอาจต้องการที่จะผ่านทั้งหมดของการขัดแย้งฟังก์ชั่นในการcdโดยใช้$@แทนที่จะเป็นเช่น:"$1"cs() { cd $@ && ls; }


1

ฉันมีปัญหาในการกำหนดใหม่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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.