Hướng dẫn cách debug code shell script trên Linux

1016
12-04-2018
Hướng dẫn cách debug code shell script trên Linux

Làm thế nào để debug một Bash Shell Script trên Linux/ UNIX? Đây là câu hỏi phổ biến được hỏi nhiều nhất bởi các sysadmins mới hoặc Linux/ UNIX users. Có nhiều cách khác nhau để debug một shell script.

Bạn cần phải vượt qua đối số -x hoặc -v để bash shell đi qua từng dòng trong tập lệnh.

Cùng Bizfly Cloud xem cách gỡ lỗi một tập lệnh bash chạy trên Linux và Unix bằng cách sử dụng các phương thức khác nhau.

Tùy chọn -x để debug một bash shell script 

Chạy một shell script với tùy chọn -x.

Sử dụng set command

Bash shell cung cấp các tùy chọn gỡ lỗi có thể bật hoặc tắt bằng cách sử dụng lệnh set:

set -x: Hiển thị các lệnh và các đối số của chúng khi chúng được thực thi.

set -v: Hiển thị các dòng đầu vào shell khi chúng được đọc.

Bạn có thể sử dụng trên hai lệnh trong chính shell script:

#!/bin/bash

clear

# turn on debug mode

set -x

for f in *

do

file $f

done

# turn OFF debug mode

set x

ls

# more commands

Bạn có thể thay thế dòng Shebang chuẩn:

#!/bin/bash

với mã sau đây (để gỡ lỗi):

#!/bin/bash -xv

Sử dụng chức năng DEBUG thông minh

Đầu tiên, thêm một biến đặc biệt gọi là _DEBUG. Đặt _DEBUG thành 'on' khi bạn cần gỡ lỗi tập lệnh:

_DEBUG="on"

Đặt hàm sau vào đầu tập lệnh:

function DEBUG()

{

[ "$_DEBUG" == "on" ] && $@

}

Bạn cần gỡ lỗi chỉ cần sử dụng chức năng DEBUG như sau:

DEBUG echo "File is $filename"

Hoặc:

DEBUG set -x

Cmd1

Cmd2

DEBUG set x

Khi thực hiện xong việc gỡ lỗi (và trước khi chuyển script của bạn sang production), đặt _DEBUG thành 'off'. Không cần phải xóa các dòng gỡ lỗi.

_DEBUG="off" # set to anything but not to 'on'

Ví dụ:

#!/bin/bash

_DEBUG="on"

function DEBUG()

{

[ "$_DEBUG" == "on" ] && $@

}

DEBUG echo 'Reading files'

for i in *

do

grep 'something' $i > /dev/null

$? -eq 0 ] && echo "Found in $i file"

done

DEBUG set -x

a=2

b=3

c=$(( $a $b ))

DEBUG set x

echo "$a $b = $c"

Lưu và đóng tập tin. Chạy script như sau:

$ ./script.sh

Output:

Reading files

Found in xyz.txt file

a=2

b=3

c=5

DEBUG set x

'[' on == on ']' set x

2 3 = 5

Bây giờ hãy đặt DEBUG thành tắt (bạn cần chỉnh sửa tệp):

_DEBUG="off"

Chạy script:

$ ./script.sh

Output:

Found in xyz.txt file

2 3 = 5

Trên đây là một kỹ thuật đơn giản nhưng khá hiệu quả. Bạn cũng có thể thử sử dụng DEBUG làm alias thay vì function.

Debugging lỗi Bash Shell Scripting thông dụng

Bash hoặc sh hoặc ksh cung cấp các thông báo lỗi khác nhau trên màn hình và trong nhiều trường hợp, thông báo lỗi có thể không cung cấp thông tin chi tiết.

Bỏ qua để áp dụng quyền thực thi trên tệp

Khi bạn viết hello world bash shell script đầu tiên của mình, bạn có thể sẽ nhận được lỗi  như sau:

bash: ./hello.sh: Permission denied

Đặt quyền sử dụng lệnh chmod:

$ chmod x hello.sh

$ ./hello.sh

$ bash hello.sh

Lỗi kết thúc tệp không mong muốn

Nếu bạn nhận được thông báo End of file unexpected error, hãy mở script file của bạn và đảm bảo tệp có cả dấu ngoặc kép mở và đóng. Trong ví dụ này, câu lệnh echo có một trích dẫn mở nhưng không có đóng:

#!/bin/bash

...

.... echo 'Error: File not found

^^^^^^^

missing quote

Ngoài ra, hãy đảm bảo bạn kiểm tra dấu ngoặc và dấu ngoặc bị thiếu ({}):

#!/bin/bash

.....

[ ! -d $DIRNAME ] && { echo "Error: Chroot dir not found"; exit 1;

^^^^^^^^^^^^^

missing brace }

...

Thiếu các keyword như fi, esac, ;;,...

Nếu bạn bỏ lỡ ending keyword như fi hoặc ;; bạn sẽ gặp lỗi như "xxx unexpected". Xem trang bash man để biết các yêu cầu cú pháp. Trong ví dụ này, fi bị thiếu:

#!/bin/bash

echo "Starting..."

....

if [ $1 -eq 10 ]

then

if [ $2 -eq 100 ]

then

echo "Do something"

fi


for f in $files

do

echo $f

done

# note fi is missing

Di chuyển hoặc chỉnh sửa shell script trên các boxes Windows hoặc Unix

Không tạo script trên Linux/ Unix và chuyển sang Windows. Một vấn đề khác là chỉnh sửa bash shell script trên Windows 10 và di chuyển/ tải lên máy chủ Unix. Nó sẽ dẫn đến một lỗi như lệnh không tìm thấy do carriage return (DOS CR-LF). Bạn có thể chuyển đổi DOS newlines CR-LF thành định dạng Unix/ Linux bằng cách sử dụng cú pháp sau:

dos2unix my-script.sh

Tip 1: Gửi Debug Message tới stderr 

Standard error là error output device mặc định, được sử dụng để ghi tất cả các thông báo lỗi hệ thống. Vì vậy, bạn nên gửi tin nhắn tới default error device:

# Write error to stdout

echo "Error: $1 file not found"

#

# Write error to stderr (note 1>&2 at the end of echo command)

#

echo "Error: $1 file not found" 1>&2

Tip 2: Bật tính năng Syntax Highlighting khi sử dụng vim text editor

Hầu hết các trình soạn thảo văn bản hiện đại cho phép bạn đặt tùy chọn syntax highlighting. Điều này rất hữu ích để phát hiện cú pháp và ngăn ngừa các lỗi phổ biến như mở hoặc đóng quote. Bạn có thể thấy bash script với các màu khác nhau. Tính năng này giúp việc viết trở nên dễ dàng hơn trong shell script structures, và các lỗi cú pháp sẽ khác biệt một cách trực quan. Highlighting không ảnh hưởng đến ý nghĩa của văn bản; nó chỉ dành riêng cho bạn. Trong ví dụ này, vim syntax highlighting được sử dụng cho tập bash script:

Hướng dẫn cách debug một Bash Shell Script trên Linux/ UNIX - Ảnh 1.

Tip 3: Sử dụng shellcheck để lint script

ShellCheck là một công cụ phân tích tĩnh cho các shell scripts, giúp tìm lỗi trong shell scripts. Nó được viết bằng Haskell. Bạn có thể tìm thấy các cảnh báo và gợi ý cho các script bash/ sh shell bằng công cụ này. 

Dịch từ: cyberciti.biz/tips/debugging-shell-script.html

Theo Bizfly Cloud chia sẻ

>> Có thể bạn quan tâm: Hướng dẫn tạo, thêm và xóa các ràng buộc duy nhất trong SQL Server.



TAGS: linux
SHARE