2011-09-14 38 views
7

Nếu tôi chạybash: debug tùy chọn và chức năng

bash -x myscript.sh 

tôi sẽ nhận được kết quả sử lỗi.

Nhưng nếu tôi có hàm trong myscript.sh, mã trong hàm sẽ miễn nhiễm với tùy chọn -x. Nó ghi để chỉ xuất ra tên của hàm.

Cách lấy đầu ra gỡ lỗi cho các hàm trong tập lệnh bash?

Cập nhật:

Sau phản ứng của ztank1013, tôi chỉ nhận ra rằng tôi đã sử dụng ksh, không bash. Dường như bash có mặc định tùy chọn functrace được kích hoạt trong hệ thống của tôi (nhờ bash-o-logist)

Tôi hài lòng, nhưng đối với cộng đồng, tôi duy trì câu hỏi mở cho ksh.

Đối với kịch bản:

#!/bin/ksh 

a=2 
testering(){ 
     a=3 
     if [ $a -eq 3 ]; then 
       echo lili 
     fi 
} 
if [ $a -eq 2 ]; then 
     echo mimi 
fi 

testering 
exit 

sản lượng ksh -x ./testdebug.sh là:

+ a=2 
+ [ 2 -eq 2 ] 
+ echo mimi 
mimi 
+ testering 
lili 
+ exit 

Vì vậy, ví ksh, lừa là gì?

(Nếu không có câu trả lời sẽ đến, các 'đúng' sẽ đi đến bash-o-logist.)

+0

câu hỏi hay, +1 – nsd

Trả lời

8

Với bash , bạn có thể sử dụng tùy chọn functrace trong kịch bản của bạn

set -o functrace 

Xem manpage cho bash cho các tùy chọn trình gỡ rối khác.

4

tôi không thể tái tạo vấn đề của bạn, trên thực tế cho kịch bản thử nghiệm của tôi (debug.sh):

[root ~]# cat debug.sh 
#!/bin/bash 
fun01() { 
echo "BUT HERE I am inside the function fun01() body" 
} 
echo "HERE I am outside the function fun01() body!" 
sleep 2 
fun01 
exit 

tôi chạy nó với tùy chọn gỡ lỗi tắt:

[root ~]# ./debug.sh 
HERE I am outside the function fun01() body! 
BUT HERE I am inside the function fun01() body 

và bật (bash -x ...):

[root ~]# bash -x ./debug.sh 
+ echo 'HERE I am outside the function fun01() body!' 
HERE I am outside the function fun01() body! 
+ sleep 2 
+ fun01 
+ echo 'BUT HERE I am inside the function fun01() body' 
BUT HERE I am inside the function fun01() body 
+ exit 

Theo như tôi có thể thấy dòng được thực hiện bên trong hàm fun01() được hiển thị với một khởi đầu + đó là trình gỡ lỗi đang hoạt động.

@ bash-o-logist Thậm chí nếu tôi thêm biến hoặc nếu/cấu trúc sau đó/khác có điều kiện tôi vẫn nhận được tất cả các thông tin gỡ lỗi:

[[email protected] ~]# cat debug-new.sh 
#!/bin/bash 
fun01() { 
INSIDEVAR='Never really use this one' 
echo "BUT HERE I am inside the function fun01() body" 
if [ true ] ; then echo 'this is going to be printed always!' ; fi 
} 
echo "HERE I am outside the function fun01() body!" 
sleep 2 
fun01 
exit 

Thi một lần nữa:

[[email protected] ~]# bash -x debug-new.sh 
+ echo 'HERE I am outside the function fun01() body!' 
HERE I am outside the function fun01() body! 
+ sleep 2 
+ fun01 
+ INSIDEVAR='Never really use this one' 
+ echo 'BUT HERE I am inside the function fun01() body' 
BUT HERE I am inside the function fun01() body 
+ '[' true ']' 
+ echo 'this is going to be printed always!' 
this is going to be printed always! 
+ exit 
+1

bạn không thể chỉ lặp lại một số câu lệnh bên trong các chức năng. Thử khai báo biến và sử dụng if/else bên trong các hàm. –

+0

+1 để giúp tôi –

2

Trong ksh sử dụng typeset -ft function-name để theo dõi vào một chức năng

+0

cách sử dụng lệnh này? Tôi đã thử kịch bản, bên ngoài, nhưng không thành công ... –

+0

@FlorinGhita bên trong tập lệnh, thay thế * 'function-name' * bằng tên của hàm đang được gỡ lỗi. – yarek

0

Tôi có câu hỏi tương tự và tôi đã kết thúc bằng văn bản debbuger của riêng mình cho Bash. Thử nó! ...Tôi hy vọng nó sẽ giúp bạn https://sourceforge.net/projects/bashdebugingbash/

+0

Đăng mã của bạn tại đây chứ không phải liên kết tới mã của bạn. –

+0

ảnh chụp màn hình trông đầy hứa hẹn nhưng không hoạt động '' ' 1/usr/share/bdb $ pwd /usr/share/bdb 1/usr/share/bdb $ ./bdb.sh + cho bdbINC trong inc/bdb.lang inc/bdb.vars inc/bdb.lib + INCFICH =/usr/share/bdb/inc/bdb.lang + typeset -u INCUPR = inc/bdblang + INCFLAG = INC/BDBLANG_INCLUDE ./bdb .sh: dòng 29: INC/BDBLANG_INCLUDE: thay thế sai + thoát '' ' và tiếng Tây Ban Nha của tôi quá tệ để hiểu mã của bạn –

Các vấn đề liên quan