สำหรับสคริปต์ทุบตีฉันสามารถใช้"$@"
เพื่อเข้าถึงอาร์กิวเมนต์ อะไรคือสิ่งที่เทียบเท่าเมื่อฉันใช้นามแฝง
สำหรับสคริปต์ทุบตีฉันสามารถใช้"$@"
เพื่อเข้าถึงอาร์กิวเมนต์ อะไรคือสิ่งที่เทียบเท่าเมื่อฉันใช้นามแฝง
คำตอบ:
นามแฝงเป็นเหมือนคำสั่งในการที่ข้อโต้แย้งทั้งหมดจะถูกส่งผ่านเป็นข้อโต้แย้งไปยังโปรแกรมที่พวกเขานามแฝง ตัวอย่างเช่นถ้าคุณกำลังจะนามแฝงls
ไปls -la
แล้วพิมพ์ls foo bar
จะจริงๆรันls -la foo bar
บนบรรทัดคำสั่ง
หากคุณต้องการควบคุมการตีความข้อโต้แย้งที่เกิดขึ้นจริงคุณสามารถเขียนฟังก์ชันดังนี้:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "$@"
}
โซลูชันนามแฝง
หากคุณต่อต้านการใช้ฟังก์ชั่นต่อ se คุณสามารถใช้:
$ alias wrap_args='f(){ echo before "$@" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
คุณสามารถแทนที่$@
ด้วย$1
ถ้าคุณต้องการอาร์กิวเมนต์แรกเท่านั้น
คำอธิบาย
สิ่งนี้จะสร้างฟังก์ชันชั่วคราวf
ซึ่งส่งผ่านอาร์กิวเมนต์
อาร์กิวเมนต์ Alias จะถูกส่งผ่านในตอนท้ายเท่านั้น โปรดทราบว่าf
ถูกเรียกที่ส่วนท้ายสุดของชื่อแทน
การunset -f
ลบคำจำกัดความของฟังก์ชั่นในขณะที่นามแฝงจะถูกดำเนินการจึงไม่ได้แขวนรอบหลังจากนั้น
wrap_args x y z
ให้ฉัน: bash: ข้อผิดพลาดทางไวยากรณ์ใกล้กับโทเค็นที่ไม่คาดคิด `('
f
นามแฝงแล้ว เมื่อฉัน unaliased f
มันทำงานได้ดี การชนกันของชื่อเก่า
command type f
:)
การเพิ่มคำตอบปัจจุบันสิ่งสำคัญที่ต้องตระหนักถึงการทำงานของนามแฝงคือพารามิเตอร์ทั้งหมดที่คุณพิมพ์หลังจากคำสั่ง aliased จะถูกใช้อย่างแท้จริงในตอนท้าย ดังนั้นจึงไม่มีวิธีใช้นามแฝงสำหรับสองคำสั่ง (ไพพ์หรือไม่) ซึ่งคำสั่งแรกควรตีความพารามิเตอร์ เพื่อให้ชัดเจนนี่เป็นตัวอย่างของสิ่งที่ไม่สามารถทำได้ตามที่คาดไว้:
alias lsswp="ls -l | grep swp"
(ตัวอย่างที่ได้รับแรงบันดาลใจจากคำถามนี้ ) สิ่งนี้จะใช้ผลลัพธ์ของls -l
การดำเนินการในไดเรกทอรีปัจจุบันและใช้ grep ในนั้น - ดังนั้นการใช้
lsswp / tmp /
จะเทียบเท่ากับls -l | grep swp /tmp/
และไม่ได้ ls -l /tmp/ | grep swp
เพื่อวัตถุประสงค์ทั้งหมดที่มีข้อโต้แย้งที่ควรจะใช้หนึ่งในกลางหนึ่งต้องใช้แทนfunction
alias
คุณไม่ต้องทำอะไรเลยจริง ๆ ; นามแฝงทำสิ่งนี้โดยอัตโนมัติ ตัวอย่างเช่น
$ alias less="less -eirqM"
$ less foo.txt
คุณจะเห็นหน้าแรกของ foo.txt และless
จะออกที่ EOF (-e) การค้นหาจะคำนึงถึงขนาดตัวพิมพ์ (-i) เป็นต้น
ฉันกำลังตอบ csh:
ใช่คุณสามารถใช้พารามิเตอร์ในนามแฝงและ - ซึ่งแตกต่างจากที่กล่าวไว้ข้างต้น - คุณสามารถอ้างถึงพารามิเตอร์เหล่านี้ได้ทุกที่ในคำจำกัดความของนามแฝง - ไม่เพียง แต่ในตอนท้าย
ตัวอย่างสำหรับ tar-gz -ing บางสิ่ง:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
ที่ใด!:1
และ!:2
เป็นพารามิเตอร์ที่คุณจะระบุเมื่อเรียกนามแฝงของคุณ
ตัวอย่างการใช้งาน:
$ ls
clrcf.dat user_comment_2016.06.03_12:51:50.txt user_comment_2016.06.03_12:54:48.txt
TEST-wADM.tec user_comment_2016.06.03_12:52:04.txt user_comment_2016.06.03_12:55:13.txt
$ tgz user* out
a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K
$ ls out*
out.tar.gz
ซึ่งหมายความว่าคุณใช้พารามิเตอร์สองอย่างที่คุณแทรกไว้ในตำแหน่งโดยพลการของคำสั่ง tar ทำให้มันเป็นนามแฝงทั้งหมด tgz
sh
my_program_wrapper() { ...; }
Bash จัดการกับคำหลักfunction
แต่ทำไมไม่ไปกับสิ่งที่พกพาได้มากกว่านี้?