Có cách nào để gỡ lỗi script bash mà không sử dụng echo và log không?
Tôi đang nói về việc sử dụng điểm dừng và những thứ như thế.
Có cách nào để gỡ lỗi script bash mà không sử dụng echo và log không?
Tôi đang nói về việc sử dụng điểm dừng và những thứ như thế.
Câu trả lời:
Vâng, có Dự án gỡ lỗi Bash .
Bạn cũng có thể sử dụng set -x
và set -v
thực hiện. Thêm thông tin:
http://www.linuxtopia.org/online_books/advified_bash_scripting_guide/debugging.html http://www.cyberciti.biz/tips/debugging-shell-script.html
Chúc may mắn!
Có nhiều cách khác nhau, nghĩa là:
Chạy tập lệnh của bạn với tùy chọn -x
bash -x yourscript.sh
Thêm set -x
vào một dòng mới ở đầu tập lệnh của bạn sau Shebang #!/bin/bash
và trước khi bắt đầu tập lệnh của bạn, set -v
sẽ hiển thị các dòng đầu vào shell, set -x
hiển thị các lệnh và đối số được thực thi
thay thế shebang của tập tin script của bạn bằng #!/bin/bash -xv
Ngày nay, có phần mở rộng Visual Studio Code Bash Debug . Nó có 'Bước vào / ra / qua' và có thể hiển thị giá trị của từng biến.
shellcheck là tốt nhất trong thị trấn -
bạn cũng có thể tích hợp với vim, đây là git repo -
Bạn có thể sử dụng chức năng nhỏ này để thả vào "console":
function debug
{
echo "#############| Entering DEBUG mode |####################";
cmd=""
while [[ $cmd != "exit" ]]; do
read -p "> " cmd
case "$cmd" in
vars ) ( set -o posix ; set );;
exit ) ;;
* ) eval "$cmd";;
esac
done
echo "#############| End of DEBUG mode |####################";
}
Sau đó, bên trong tập lệnh của bạn (VÍ DỤ):
for file in *; do
...
if [[ $file == "strange_case.txt" ]]; then
# break the code here to analyze:
debug
fi
...
done
Nó sẽ chấp nhận bất kỳ lệnh nào, giữ nguyên các biến cục bộ. Để thoát chế độ "gỡ lỗi", nhập "exit" (nó sẽ không thoát khỏi tập lệnh) và nó sẽ tiếp tục với mã. Nếu bạn sử dụng "gỡ lỗi" trong một vòng lặp, nó sẽ dừng mỗi lần. Bạn có thể bọc nó bên trong một chữ "nếu" (như trong ví dụ trên) hoặc tạo chức năng "xem":
function debug_watch
{
if [[ $1 == $2 ]]; then
debug
fi
}
# And Use it:
debug_watch "$file" "strange_case.txt"
Tôi cũng đã thêm lệnh "vars" sẽ kết xuất tất cả các biến có sẵn và giá trị của chúng. Bạn có thể thêm các lệnh tùy chỉnh của riêng bạn là tốt.
Tôi đã làm mã trong vài phút để sử dụng nó dưới rủi ro của riêng bạn. Xin lưu ý rằng trong chế độ gỡ lỗi, bất kỳ lệnh nào cũng có thể được thực thi, do đó, nó có thể gây rủi ro bảo mật nếu bạn để nó trong tập lệnh sản xuất.
Theo giai điệu của những gì NES đang nói, có các cờ được đặt trong bash để cho phép gỡ lỗi.
Các set -x
lá cờ có thể được thiết lập và unset hoặc từ các thiết bị đầu cuối, hoặc từ bên trong kịch bản của bạn. Sử dụng +
hoặc -
:
#!/bin/bash
#fileinfo
ls -l $1
set -x # start debugging here
wc -l $1
set +x # stop debugging here
file $1
set -v # start verbose output
w | more
echo ""
echo -n "Number of users: "
set +v # end verbose output
who | wc -l
Đây là những gì các set
lệnh làm:
set -f
Vô hiệu hóa việc tạo tên tệp bằng siêu dữ liệu.set -v
In các dòng đầu vào shell (verbose) khi chúng được đọc.set -x
In dấu vết lệnh trước khi thực hiện lệnh.set
thực sự có nhiều tính năng, nhưng hy vọng không có trang man vì nó là một công cụ được tích hợp sẵn. Hướng dẫn cho tập hợp nằm trong tài liệu GNU Bash .
Có nhiều công cụ dòng lệnh có thể giúp bạn biết chi tiết về chương trình của mình như:
stat
hiển thị tập tin hoặc trạng thái hệ thống tập tin file
xác định một loại tập tin.hexdump
bộ lọc hiển thị các tệp được chỉ định theo nhiều định dạngnohup
Chạy một kịch bản không bị treo
và nhiều người khác. Tôi đã cố gắng nghĩ về lệnh hiển thị các ký tự ẩn, nhưng tôi không thể thực hiện nó ngay bây giờ. Hexdump sẽ làm điều đó nhưng có một cái tốt hơn.
Lệnh key ctrl\sẽ khiến chương trình hoặc tập lệnh đang chạy bị đổ lõi. Sau đó, bạn có thể phân tích coredump. Tôi có thể sẽ sử dụng gdb để phân tích một coredump, nhưng nhiều chương trình tồn tại cho điều đó.
Shell bash có một số tùy chọn tiện lợi để gỡ lỗi quá. tùy chọn --debugger
, -v
dài dòng --dump-strings
và các tùy chọn tiện lợi khác để hỗ trợ bạn. Kiểm tra chúng bằng cách sử dụng man bash
.
Các trap
lệnh (shell xây dựng trong) có thể sẽ rất hữu ích cho bạn. bẫy nói nếu chương trình của bạn thoát ra bất ngờ, hãy thực thi một cái gì đó. Bạn đọc về bẫy và các nội dung Bash Shell tiện dụng khác ở đây .
Nói chung vào lúc này, gỡ lỗi là một chủ đề lớn trong bất kỳ ngôn ngữ nào. Một số chủ đề khác có thể thuận tiện để gỡ lỗi trong bất kỳ ngôn ngữ lập trình nào, bao gồm chuyển hướng hệ vỏ và xử lý tín hiệu.
Cuối cùng, tôi nhận ra ví dụ tôi sử dụng là tầm thường, nhưng một số tập lệnh shell có thể là hàng trăm dòng. Trong những tình huống đó, tôi muốn chèn các thẻ nhận xét và chặn mã mà tôi nghi ngờ là bị lỗi, hoặc Cách khác, chèn lệnh thoát và cố gắng tách mã chức năng khỏi mã bị hỏng, sử dụng kỹ thuật phân chia và chinh phục.
Một tùy chọn GUI để gỡ lỗi một tập lệnh bash là IDE Eclipse với các pluggins BashEclipse / Shelled.
Điều này cung cấp các tính năng của câu hỏi của bạn ( breakpoints and stuff
) cùng với một loạt các tính năng khác để gỡ lỗi các tập lệnh bash phức tạp.
Một số tính năng bao gồm:
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )
Các bước để sử dụng là thêm Shelled
và BashEclipse
pluggins vào nhật thực. Sau đó chạy thủ tục được cung cấp trong BashEclipse đọc tệp văn bản cho tôi để khởi động trình gỡ lỗi.
* ) eval "$cmd" ;;
vàdebug_watch "$file" strange_case.txt
.