จะส่งพารามิเตอร์ไปยังนามแฝงได้อย่างไร


64

สำหรับสคริปต์ทุบตีฉันสามารถใช้"$@"เพื่อเข้าถึงอาร์กิวเมนต์ อะไรคือสิ่งที่เทียบเท่าเมื่อฉันใช้นามแฝง

คำตอบ:


50

นามแฝงเป็นเหมือนคำสั่งในการที่ข้อโต้แย้งทั้งหมดจะถูกส่งผ่านเป็นข้อโต้แย้งไปยังโปรแกรมที่พวกเขานามแฝง ตัวอย่างเช่นถ้าคุณกำลังจะนามแฝง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 "$@"
}

3
opengroup.org/onlinepubs/009695399/utilities/...ฟังก์ชั่นในการที่กำหนดไว้sh my_program_wrapper() { ...; }Bash จัดการกับคำหลักfunctionแต่ทำไมไม่ไปกับสิ่งที่พกพาได้มากกว่านี้?
ephemient

2
@ephemient จริงมาก ฉันหมายถึงนอกเหนือจากความจริงที่ว่าทุกคนใช้ GNU Bash และไม่ใช่เปลือกเปล่า POSIX
แอมเฟตามาจิน

21

โซลูชันนามแฝง

หากคุณต่อต้านการใช้ฟังก์ชั่นต่อ 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ลบคำจำกัดความของฟังก์ชั่นในขณะที่นามแฝงจะถูกดำเนินการจึงไม่ได้แขวนรอบหลังจากนั้น


humm? wrap_args x y zให้ฉัน: bash: ข้อผิดพลาดทางไวยากรณ์ใกล้กับโทเค็นที่ไม่คาดคิด `('
มุมมองรูปไข่

@Elipticalview อืมคัดลอกปัญหาการวางหรือไม่ ยืนยันการทำงานกับทุบตี 4.4.12
Tom Hale

1
ฉันได้fนามแฝงแล้ว เมื่อฉัน unaliased fมันทำงานได้ดี การชนกันของชื่อเก่า
มุมมองรูปไข่

command type f:)
Tom Hale

1
ที่ดี! นั่นเป็นตัวแปรที่ขี้เกียจที่สุด!
Sergius

19

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

alias lsswp="ls -l | grep swp"

(ตัวอย่างที่ได้รับแรงบันดาลใจจากคำถามนี้ ) สิ่งนี้จะใช้ผลลัพธ์ของls -lการดำเนินการในไดเรกทอรีปัจจุบันและใช้ grep ในนั้น - ดังนั้นการใช้

lsswp / tmp /

จะเทียบเท่ากับls -l | grep swp /tmp/ และไม่ได้ ls -l /tmp/ | grep swp

เพื่อวัตถุประสงค์ทั้งหมดที่มีข้อโต้แย้งที่ควรจะใช้หนึ่งในกลางหนึ่งต้องใช้แทนfunctionalias


15

คุณไม่ต้องทำอะไรเลยจริง ๆ ; นามแฝงทำสิ่งนี้โดยอัตโนมัติ ตัวอย่างเช่น

$ alias less="less -eirqM"
$ less foo.txt

คุณจะเห็นหน้าแรกของ foo.txt และlessจะออกที่ EOF (-e) การค้นหาจะคำนึงถึงขนาดตัวพิมพ์ (-i) เป็นต้น


คุณช่วยกรุณาดูที่คำถามของฉัน - ไม่มีวิธีแก้ปัญหาสำหรับฉันและฉันไม่ได้รับอนุญาตให้เริ่มรางวัล
JJD

1
@JJD ผู้ที่ตอบคำถามของคุณถูกต้อง: คุณต้องการฟังก์ชั่นในกรณีนั้นไม่ใช่นามแฝง เนื่องจากคำตอบที่ยอมรับสำหรับคำถามนี้เป็นคำถามเดียวกันคำถามของคุณจึงถูกปิดอย่างถูกต้อง
Warren Young

1

ฉันกำลังตอบ 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

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