แก้ไขข้อ จำกัด นามแฝงด้วยคำสั่งกลุ่มและ here-string
นามแฝงไม่สามารถโต้แย้งได้ แต่เราสามารถ "จำลอง" สิ่งนั้นได้ ยกตัวอย่างเช่นคำตอบของฉันในคำถามนี้
alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'
ประเด็นสำคัญที่เกิดขึ้นที่นี่:
- เราใช้สร้างขึ้นในการอ่านสตริงลงในตัวแปร
read
d
เพราะเราต้องการที่จะอ่านสตริงเต็มรูปแบบรวมถึงตัวละครที่ว่างเปล่า (ของขึ้นบรรทัดใหม่แท็บช่องว่าง) ที่เราใช้และทับขวาหลังปิดหนีกับIFS=
-r
<<<
ซึ่งตัวดำเนินการที่นี่คือสตริงช่วยให้เราสามารถเปลี่ยนเส้นทางสิ่งที่เราให้เป็นอาร์กิวเมนต์ไปยังmkcd
นามแฝง; การใช้งานจะเป็นเช่นmkcd "some directory"
- คำสั่งหลาย ๆ คำสั่งภายในนามแฝงจะถูกรวมและดำเนินการในเชลล์ปัจจุบันโดยใช้
{ list; }
โครงสร้าง (ซึ่งรู้จักกันgroup command
ในbash
คู่มือ) โปรดทราบว่าต้องมีการเว้นวรรคนำหน้า{
และ;
รายการคำสั่งแต่ละรายการ
ในตัวอย่างเฉพาะของคุณเราสามารถทำได้:
alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'
เราสามารถใช้การแบ่งคำเพื่อเก็บอาร์กิวเมนต์ที่คั่นด้วยช่องว่าง:
bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "arg1 arg2"
arg1
arg2
หรือเราสามารถใช้อาร์เรย์เพื่อระบุอาร์กิวเมนต์หลายตัว:
bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";} <<< "arg1 arg2"
arg2
arg1
แต่วิธีนี้เป็นวิธีที่ดีหรือไม่?
ไม่จำเป็น. ปัญหาของวิธีการดังกล่าวคือมันมีความเฉพาะเจาะจงมาก - ไม่สามารถอ้างถึงข้อโต้แย้งได้ง่ายซึ่งหมายความว่าเราสามารถมีข้อโต้แย้งที่ไม่มีช่องว่างเท่านั้น
bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "'arg1 with space' arg2"
'arg1
with space' arg2
แน่นอนว่านี่ไม่ใช่สิ่งที่จะนำมาใช้กันอย่างแพร่หลายเพียงเพราะในโลกแห่งความเป็นจริงเราต้องจัดการกับข้อโต้แย้งที่ซับซ้อนดังนั้นวิธีการนี้จึงใช้ไม่ได้จริง ฟังก์ชั่นมีความยืดหยุ่นมากกว่า และความต้องการที่จะพูดสตริง args จะกลายเป็นที่น่ารำคาญอย่างรวดเร็ว
แม้จะมีข้อ จำกัด การทำงานกับสตริงอย่างง่าย ๆ เป็นข้อโต้แย้งที่เราสามารถแบ่งคำได้ดังนั้นบางส่วนทำให้เราสามารถโต้แย้งกับนามแฝงได้