Thực thi lệnh được cung cấp bởi các tham số chức năng


15

Tôi đang cố gắng tạo một phương thức hàm trong tập lệnh bash thực thi một lệnh được cung cấp cho phương thức bởi các tham số.

Có nghĩa là đôi khi như thế này:

special_execute()
{
    # Some code

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

    # More code
}

special_execute echo "abc"

Tôi đã cố gắng tôi $@, "$@", $*, "$*"cách nào tôi có thể làm điều đó?


$@làm việc cho tôi .. special() { $@; }... special echo "foo"chofoo
Drav Sloan

Nó không hoạt động với tôi với: 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
sử dụng dấu ngoặc kép "$@", sau đó bạn sẽ có nhiều thành công hơn :)
Drav Sloan

Đồng ý. Bây giờ nó hoạt động. có vẻ như tôi đã làm rối mã mã trong cuộc gọi thực tế.
BrainStone

không vấn đề gì, tất cả chúng ta đều có những khoảnh khắc đó :)
Drav Sloan

Câu trả lời:


10

Tôi nghĩ rằng đó chỉ là một vấn đề trích dẫn khi bạn chuyển các đối số vào hàm.

Hãy thử gọi nó như vậy:

$ special_execute "echo 'abc'"
'abc'

Nếu bạn không muốn các trích dẫn đơn xung quanh abcthì hãy thay đổi trích dẫn như thế này:

$ special_execute "echo abc"
abc

Gỡ lỗi

Bạn có thể bọc các phần bên trong của hàm để nó vang lên với độ dài hơn.

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

Sau đó, khi bạn chạy các lệnh thông qua chức năng, special_executebạn có thể thấy những gì đang diễn ra.

ví dụ 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]
...

ví dụ 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

Đối số phân tích cú pháp $1

Bạn có thể làm một cái gì đó như thế này để phân tích bất kỳ đối số nào được đưa vào dưới dạng $1.

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

Thí dụ

với tính năng gỡ lỗi được kích hoạt:

$ 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

với gỡ lỗi - -123:

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

với gỡ lỗi - -456:

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

Tại sao tôi gặp lỗi khi nói 'không tìm thấy lệnh' khi sử dụng bí danh?
Elie G.

@DrunkenPoney - không có cmd như vậy, nó alias.
slm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.