Bash Alias - ลำดับความสำคัญ / เงา (/ ซ่อน / ล้มเหลว)
ฉันมีการตั้งค่านามแฝง (ตามลำดับนี้) ใน. bashrc:
alias ls="lsc"
alias lsc='ls -Flatr --color=always'
alias lscR='ls -FlatrR --color=always'
ยืนยันด้วยalias
หลังจากการจัดหา:
alias ls='lsc'
alias lsc='ls -Flatr --color=always'
alias lscR='ls -FlatrR --color=always'
ฉันสามารถเรียกใช้นามแฝงใหม่ได้ls
ดีและเชื่อมโยงกับนามแฝง lsc จากนั้นเรียกใช้คำสั่งที่เกี่ยวข้องกับนามแฝง lsc ฉันยังสามารถวิ่งได้lscR
และทำงานได้ตามที่คาดไว้
ถ้าฉันพยายามเรียกใช้lsc
ตัวเองฉันจะได้รับ:
$ lsc
lsc: command not found
มีความคิดว่าทำไมเชลล์จึงดูเหมือนเป็นเงา / ซ่อนนามแฝง lsc ในสถานการณ์นี้ (ฉันตระหนักดีว่ามันไม่มีประโยชน์ที่จะเรียกใช้ 'lsc' เมื่อฉันสามารถเรียกใช้ 'ls' เพื่อให้ได้ผลลัพธ์เดียวกันที่นี่ แต่ฉันพยายามเข้าใจพฤติกรรมของเชลล์ในสถานการณ์นี้)
แก้ไข: วิธีแก้ปัญหาด้านล่างสำหรับพฤติกรรมของเชลล์ (ทุบตี) ที่ให้ไว้ในคำตอบของคำถาม
คำตอบที่เป็นประโยชน์จริง ๆ มีให้สำหรับคำถามเดิม เพื่อให้เกิดการลัดวงจรของพฤติกรรมการขยายที่อธิบายไว้ในคำตอบดูเหมือนว่าจะมีอย่างน้อยสองวิธีในการป้องกันนามแฝงที่สองจากการพยายามขยายคำสั่งที่คุณมีนามแฝงอยู่แล้ว ตัวอย่างเช่นหากคุณมีalias cmd='cmd --stuff'
ซึ่งกำลังแทนที่คำสั่งเนทีฟที่เรียกว่าcmd
คุณสามารถป้องกันไม่ให้ใช้นามแฝง 'cmd' แทนเนทีฟcmd
ภายในนามแฝงอื่น ๆ โดย:
(ขอบคุณความคิดเห็นของ wjandrea สำหรับแนวทางแรกนี้)
- คำนำหน้า
cmd
ด้วย 'command' ในนามแฝงอื่น ๆ เช่นalias other-cmd-alias='command cmd --other-stuff'
หรือ,
- ในทำนองเดียวกันคุณสามารถหลบหนีนามแฝง (ตามที่คุณยังสามารถทำในบรรทัดคำสั่ง) ภายในนามแฝงอื่น ๆ โดย prefixing ด้วยเครื่องหมาย ''
alias other-cmd-alias='\cmd --other-stuff'
เช่น
คำตอบ
Bash อนุญาตให้นามแฝงมีนามแฝง แต่มีการป้องกันในตัวจากลูปที่ไม่มีที่สิ้นสุด ในกรณีของคุณเมื่อคุณพิมพ์lsc
bash ก่อนขยายนามแฝงเป็น:
ls -Flatr --color=always
เนื่องจากls
เป็นนามแฝงด้วย bash จึงขยายเป็น:
lsc -Flatr --color=always
lsc
เป็นนามแฝง แต่ค่อนข้างสมเหตุสมผลทุบตีปฏิเสธที่จะขยายมันเป็นครั้งที่สอง หากมีชื่อโปรแกรมlsc
bash จะเรียกใช้งาน command not found
แต่มีไม่ได้และนั่นคือเหตุผลที่คุณได้รับ
ภาคผนวก
มันแตกต่างกันเมื่อlscR
วิ่ง lscR
ขยายเป็น:
ls -FlatrR --color=always
เนื่องจากls
เป็นนามแฝงจึงขยายเป็น:
lsc -FlatrR --color=always
เนื่องจากlsc
เป็นนามแฝงจึงขยายเป็น:
ls -Flatr --color=always -FlatrR --color=always
นับตั้งแต่ls
ได้รับการขยายตัวครั้งทุบตีปฏิเสธที่จะขยายเป็นครั้งที่สอง เนื่องจากมีคำสั่งจริงที่เรียกว่าls
มีอยู่จึงรัน
ประวัติศาสตร์
เท่าที่สังเกตจากSchilyในความคิดเห็นที่ทุบตียืมแนวคิดของการไม่ขยายนามแฝงเป็นครั้งที่สองจากksh
นอกจากนี้
นามแฝงมีประโยชน์ แต่ไม่ทรงพลังมาก หากคุณถูกล่อลวงให้ทำบางสิ่งที่ซับซ้อนด้วยนามแฝงเช่นการแทนที่อาร์กิวเมนต์อย่าทำ ใช้ฟังก์ชันเชลล์แทน
จากคู่มือทุบตี :
คำแรกของข้อความแทนที่ถูกทดสอบสำหรับนามแฝง แต่คำที่เหมือนกับนามแฝงที่ถูกขยายจะไม่มีการขยายเป็นครั้งที่สอง ซึ่งหมายความว่าอาจใช้นามแฝงว่า
ls
"ls -F
" เป็นต้นและ Bash จะไม่พยายามขยายข้อความแทนที่ซ้ำ
ในls
นามแฝงls
จะขยายเป็นlsc
และจากนั้นอีกครั้งเป็นls -Flatr --color=always
และที่นั่นการขยายนามแฝงจะหยุดลงเนื่องจากls
เดิมถูกขยาย ดังนั้นคำสั่งจึงทำงานได้ดีls
ขณะนี้ได้รับการแก้ไขเป็นคำสั่งภายนอก
ในlsc
นามแฝงlsc
จะขยายเป็นls -Flatr --color=always
และจากนั้นls
จะขยายเป็นlsc
และที่นั่นการขยายนามแฝงจะหยุดลงเนื่องจากlsc
เดิมถูกขยาย lsc
ดังนั้นคำสั่งล้มเหลวตั้งแต่ทุบตีไม่ทราบว่าของคนอื่น ๆ