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 abc
thì 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_execute
bạ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
$@
làm việc cho tôi ..special() { $@; }
...special echo "foo"
chofoo