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 abc
maka 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_execute
Anda 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
$@
bekerja untuk saya ..special() { $@; }
...special echo "foo"
memberikanfoo