Bash Alias ​​- ลำดับความสำคัญ / เงา (/ ซ่อน / ล้มเหลว)

Aug 17 2020

ฉันมีการตั้งค่านามแฝง (ตามลำดับนี้) ใน. 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 สำหรับแนวทางแรกนี้)

  1. คำนำหน้าcmdด้วย 'command' ในนามแฝงอื่น ๆ เช่นalias other-cmd-alias='command cmd --other-stuff'

หรือ,

  1. ในทำนองเดียวกันคุณสามารถหลบหนีนามแฝง (ตามที่คุณยังสามารถทำในบรรทัดคำสั่ง) ภายในนามแฝงอื่น ๆ โดย prefixing ด้วยเครื่องหมาย '' alias other-cmd-alias='\cmd --other-stuff'เช่น

คำตอบ

13 John1024 Aug 17 2020 at 11:58

Bash อนุญาตให้นามแฝงมีนามแฝง แต่มีการป้องกันในตัวจากลูปที่ไม่มีที่สิ้นสุด ในกรณีของคุณเมื่อคุณพิมพ์lscbash ก่อนขยายนามแฝงเป็น:

ls -Flatr --color=always

เนื่องจากlsเป็นนามแฝงด้วย bash จึงขยายเป็น:

lsc -Flatr --color=always

lscเป็นนามแฝง แต่ค่อนข้างสมเหตุสมผลทุบตีปฏิเสธที่จะขยายมันเป็นครั้งที่สอง หากมีชื่อโปรแกรมlscbash จะเรียกใช้งาน 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

นอกจากนี้

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

6 muru Aug 17 2020 at 12:00

จากคู่มือทุบตี :

คำแรกของข้อความแทนที่ถูกทดสอบสำหรับนามแฝง แต่คำที่เหมือนกับนามแฝงที่ถูกขยายจะไม่มีการขยายเป็นครั้งที่สอง ซึ่งหมายความว่าอาจใช้นามแฝงว่าls" ls -F" เป็นต้นและ Bash จะไม่พยายามขยายข้อความแทนที่ซ้ำ

ในlsนามแฝงlsจะขยายเป็นlscและจากนั้นอีกครั้งเป็นls -Flatr --color=alwaysและที่นั่นการขยายนามแฝงจะหยุดลงเนื่องจากlsเดิมถูกขยาย ดังนั้นคำสั่งจึงทำงานได้ดีlsขณะนี้ได้รับการแก้ไขเป็นคำสั่งภายนอก

ในlscนามแฝงlscจะขยายเป็นls -Flatr --color=alwaysและจากนั้นlsจะขยายเป็นlscและที่นั่นการขยายนามแฝงจะหยุดลงเนื่องจากlscเดิมถูกขยาย lscดังนั้นคำสั่งล้มเหลวตั้งแต่ทุบตีไม่ทราบว่าของคนอื่น ๆ