Jalankan perintah yang disediakan oleh parameter fungsi

15

Saya mencoba untuk membuat metode fungsi dalam skrip bash yang mengeksekusi perintah yang disediakan untuk metode oleh parameter.

Berarti sesuatu seperti ini:

special_execute()
{
    # Some code

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

    # More code
}

special_execute echo "abc"

Saya sudah mencoba saya $@, "$@", $*, "$*"bagaimana aku bisa melakukan itu?

BrainStone
sumber
$@bekerja untuk saya .. special() { $@; }... special echo "foo"memberikanfoo
Drav Sloan
Itu tidak berhasil untuk saya dengan: perl -MTime::HiRes=sleep -le 'for(1..100) { print; sleep 0.05; }'dantar -cvf "backups/test.tar" -P "backups/uncompressed_server_backup_(DO NOT TOUCH!)/server/"
BrainStone
3
gunakan tanda kutip sekitar "$@", maka Anda akan lebih sukses :)
Drav Sloan
Baik. Sekarang berhasil. sepertinya saya mengacaukan kode di sekitar panggilan yang sebenarnya.
BrainStone
tidak masalah, kita semua memiliki saat-saat itu :)
Drav Sloan

Jawaban:

10

Saya pikir itu hanya masalah mengutip ketika Anda memberikan argumen ke dalam fungsi.

Coba panggil seperti ini:

$ special_execute "echo 'abc'"
'abc'

Jika Anda tidak ingin tanda kutip tunggal di sekitar abcmaka ubah kutipan seperti ini:

$ special_execute "echo abc"
abc

Debugging

Anda dapat membungkus bagian dalam fungsi tersebut agar bergema dengan lebih banyak verbositas.

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

Kemudian ketika Anda menjalankan perintah melalui fungsi, special_executeAnda dapat melihat apa yang terjadi.

ps contoh:

$ 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]
...

contoh 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

Argumen parsing $1

Anda bisa melakukan sesuatu seperti ini untuk mem-parsing setiap argumen yang diajukan sebagai $1.

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

Contoh

dengan debugging diaktifkan:

$ 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

dengan debugging off - -123:

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

dengan debugging off - -456:

$ special_execute -456 perl -MTime::HiRes=sleep -le 'for(1..5) { print; sleep 0.05; }'
flagN
1
2
3
4
5
slm
sumber
Mengapa saya mendapat pesan kesalahan 'perintah tidak ditemukan' saat menggunakan alias?
Elie G.
@DrunkenPoney - tidak ada cmd, itu alias.
slm