ดำเนินการคำสั่งที่จัดทำโดยพารามิเตอร์ฟังก์ชัน


15

ฉันพยายามที่จะสร้างวิธีการฟังก์ชั่นในสคริปต์ทุบตีที่ดำเนินการคำสั่งซึ่งให้กับวิธีการโดยพารามิเตอร์

ความหมายบางอย่างเช่นนี้:

special_execute()
{
    # Some code

    # Here's the point where the command gets executed
    $@

    # More code
}

special_execute echo "abc"

ฉันพยายามแล้วผม$@, "$@", $*, "$*"วิธีการที่ฉันจะทำเช่นนั้น?


$@ได้ผลสำหรับฉัน .. special() { $@; }... special echo "foo"ให้foo
Drav Sloan

มันไม่ได้ผลสำหรับฉันด้วย: perl -MTime::HiRes=sleep -le 'for(1..100) { print; sleep 0.05; }'และtar -cvf "backups/test.tar" -P "backups/uncompressed_server_backup_(DO NOT TOUCH!)/server/"
BrainStone

3
การใช้คำพูดรอบ"$@"แล้วคุณจะมีความสำเร็จมากขึ้น :)
Drav โลน

ตกลง. ตอนนี้มันใช้งานได้ ดูเหมือนว่าฉันจะสับสนรหัสจัดสายจริง
BrainStone

ไม่มีปัญหาเราทุกคนมีช่วงเวลาเหล่านั้น :)
Drav โลน

คำตอบ:


10

ฉันคิดว่ามันเป็นเพียงปัญหาข้อความเมื่อคุณส่งอาร์กิวเมนต์เข้าไปในฟังก์ชัน

ลองโทรหาแบบนี้:

$ special_execute "echo 'abc'"
'abc'

หากคุณไม่ต้องการคำพูดเดี่ยว ๆ ให้abcเปลี่ยนข้อความดังนี้:

$ special_execute "echo abc"
abc

แก้จุดบกพร่อง

คุณสามารถใส่ฟังก์ชั่นภายในของฟังก์ชั่นเพื่อให้มันสะท้อนออกมาอย่างละเอียดมากขึ้น

$ function special_execute() { set -x; "$@"; set +x; }

จากนั้นเมื่อคุณเรียกใช้คำสั่งผ่านฟังก์ชั่นspecial_executeคุณจะเห็นสิ่งที่เกิดขึ้น

ตัวอย่าง ps:

$ special_execute ps -eaf
+ ps -eaf
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Aug21 ?        00:00:01 /sbin/init
root         2     0  0 Aug21 ?        00:00:00 [kthreadd]
...

ตัวอย่าง Perl:

$ special_execute perl -MTime::HiRes=sleep -le 'for(1..10) { print; sleep 0.05; }'
+ perl -MTime::HiRes=sleep -le 'for(1..10) { print; sleep 0.05; }'
1
2
3
4
5
6
7
8
9
10
+ set +x

การแยกวิเคราะห์อาร์กิวเมนต์ $1

คุณสามารถทำอะไรเช่นนี้ที่จะแยกข้อโต้แย้งใด ๆ $1ที่ส่งผ่านไปในขณะที่

$ function special_execute() { 
    [ "$1" -eq "-123" ] && echo "flagY" || echo "flagN"; 
    shift; 
    set -x; "$@"; set +x; 
  }

ตัวอย่าง

เมื่อเปิดใช้งานการแก้ไขข้อบกพร่อง:

$ special_execute -123 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagY
+ perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
1
2
3
4
5
+ set +x

ด้วยการดีบั๊กปิด - -123:

$ special_execute -123 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagY
1
2
3
4
5

ด้วยการดีบั๊กปิด - -456:

$ special_execute -456 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagN
1
2
3
4
5

เหตุใดฉันจึงได้รับข้อผิดพลาดว่า 'ไม่พบคำสั่ง' เมื่อใช้นามแฝง
Elie G.

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