Bash: ช่องว่างในชื่อนามแฝง


116

ฉันพยายามสร้างนามแฝงด้วยการทุบตี สิ่งที่ฉันต้องการจะทำคือทำแผนที่ls -laให้ls -la | more

ในไฟล์. bashrc ของฉันนี่คือสิ่งที่ฉันพยายาม:

alias 'ls -la'='ls -la | more'

อย่างไรก็ตามมันไม่ทำงานเพราะ (ฉันถือว่า) มันมีช่องว่างในชื่อนามแฝง มีวิธีแก้ไขสำหรับสิ่งนี้หรือไม่?


8
ทำไมไม่ทำalias lsm='ls -la | more'
Nifle

คำตอบ:


125

เอกสารคู่มือBashระบุว่า "สำหรับเกือบทุกวัตถุประสงค์ฟังก์ชั่นของเชลล์จะต้องการมากกว่าชื่อแทน" นี่คือฟังก์ชั่นเปลือกที่มาแทนที่lsและทำให้เกิดการส่งออกจะได้รับการประปาmoreถ้าอาร์กิวเมนต์ประกอบด้วย -la(เท่านั้น)

ls() {
    if [[ $@ == "-la" ]]; then
        command ls -la | more
    else
        command ls "$@"
    fi
}

ในฐานะที่เป็นหนึ่งซับ:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

ส่งออกท่ออัตโนมัติ:

ls -la

1
ทำไมคุณต้องใช้วงเล็บสองตัวในคำสั่ง if
sixtyfootersdude

1
@sixtyfootersdude: รูปแบบวงเล็บคู่มีประสิทธิภาพมากขึ้นและฉันใช้โดยนิสัย ดูmywiki.wooledge.org/BashFAQ/031
Dennis Williamson

ดังนั้นคำสั่งสุดท้ายคืออะไร? alias ls = 'ls ()' ??
Jeef

1
@Jeef: ไม่คำตอบของฉันใช้ฟังก์ชั่นแทนนามแฝง ฉันได้ทำการแก้ไขเพื่อให้ชัดเจนยิ่งขึ้น
Dennis Williamson

6
@merlinpatt: commandป้องกันไม่ให้ฟังก์ชันถูกเรียกซ้ำ
Dennis Williamson

53

จากหน้านามแฝง :

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

ดังนั้นจะตรวจสอบคำแรกสำหรับการจับคู่ชื่อแทนซึ่งทำให้ชื่อแทนหลายคำเป็นไปไม่ได้ คุณอาจจะสามารถเขียนเชลล์สคริปต์ซึ่งตรวจสอบข้อโต้แย้งและโทรคำสั่งของคุณหากพวกเขาตรงและมิฉะนั้นก็เรียกปกติls(ดูคำตอบ @Dennis Williamson ของ )


8
+1 สำหรับการอธิบายว่าทำไมฉันจึงไม่ได้รับอนุญาตให้ใช้ ls -la เป็นนามแฝง
sixtyfootersdude

7
สิ่งนี้มีประโยชน์เพราะแทนที่จะพยายามแก้ปัญหามันก็ตอบคำถาม ฉันมาที่นี่เพราะฉันต้องการสร้างนามแฝงที่มีที่ว่างในนั้นและจะไม่เกิดขึ้น
angryundead

สิ่งนี้ไม่เพียง แต่ตอบคำถามของฉันเท่านั้น แต่ยังให้ข้อมูลเชิงลึกที่มีค่าแก่ฉันเกี่ยวกับวิธีการทำงานของกลไกนามแฝง คำพูดของคุณจาก man page นั้นค่อนข้างมีประโยชน์
Lily Finley

14

แนวทางที่ได้รับการปรับปรุงเล็กน้อยจากคำตอบของ Dennis:

function ls() {
  case $* in
    -la* ) shift 1; command ls -la "$@" | more ;;
    * ) command ls "$@" ;;
  esac
}

หรือหนึ่งซับ:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }

สิ่งนี้ยอมให้มีการเพิ่มเติมตัวเลือก / อาร์กิวเมนต์เพิ่มเติมหลังจากคำสั่งหากจำเป็นตัวอย่างเช่น ls -la -h


2
วิธีนี้จะจัดการถ้าฉันต้องการที่ls -latจะถูกแยกออกจากการรักษานี้? ฉันจะต้องใส่เคสเพื่อจัดการมันเหนือ-la*รายการใช่มั้ย
Steven Lu

-1

คุณสามารถเรียกใช้นามแฝงนี้ได้ แต่คุณต้องมีเครื่องหมายอัญประกาศเพื่อให้พื้นที่ว่างเป็นส่วนหนึ่งของคำสั่ง ดังนั้น"ls -la" -p patternจะผ่านการ-p patternเลือกที่จะไม่morels

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