Làm thế nào để gỡ lỗi một tập lệnh bash?

How Debug Bash Script




Bất kỳ chương trình nào cũng cần không có lỗi trước khi đến tay người tiêu dùng. Các nhà phát triển phần mềm cố gắng hết sức để làm cho các chương trình phần mềm không có lỗi. Nhưng thật khó để làm cho một đoạn mã không có lỗi khi có hàng nghìn dòng. Gỡ lỗi là một quá trình liên tục; nó giúp phát hiện lỗi ngay lập tức, thu thập thông tin có giá trị về mã và loại bỏ các đoạn mã dư thừa.

Tất cả các ngôn ngữ lập trình đều có một số cách tiếp cận chung và một số cách tiếp cận riêng biệt để tìm ra lỗi. Ví dụ, các chương trình gỡ lỗi có thể được sử dụng để loại bỏ lỗi một cách nhanh chóng. Trong khi kịch bản shell không có bất kỳ công cụ cụ thể nào để gỡ lỗi mã. Bài viết này thảo luận về các kỹ thuật gỡ lỗi khác nhau có thể được sử dụng để làm cho tập lệnh bash không bị lỗi. Trước khi đi sâu vào các phương pháp, chúng ta hãy hiểu cơ bản về shell và script shell:







Shell trong Linux là gì?

Khi bạn khởi động máy tính của mình, hạt nhân sẽ nhận được thông tin về phần cứng được đính kèm và cho phép các thành phần đính kèm khác tương tác. Ngoài ra, nó quản lý bộ nhớ, CPU và nhận dạng bất kỳ thiết bị ngoại vi mới nào. Nói chung, hạt nhân là xương sống của bất kỳ hệ điều hành nào. Nhưng bạn đã bao giờ nghĩ sẽ tương tác trực tiếp với kernel, ra lệnh cho nó thực hiện một tác vụ cụ thể nào chưa? Nó thậm chí có thể thực hiện để làm điều đó? Chắc chắn rồi! Với sự trợ giúp của shell, một chương trình máy tính có giao diện tương tác, bất kỳ ai cũng có thể vận hành hạt nhân. Vỏ cho phép con người tương tác với hạt nhân và hướng dẫn nó thực hiện bất kỳ tác vụ nào.



Trong Unix, có hai trình bao chính Vỏ BourneVỏ C . Cả hai loại này đều có các danh mục phụ của chúng. Các loại vỏ Bourne khác nhau là Vỏ korn (ksh), vỏ Almquist (tro), vỏ Bourne lại (bash),Vỏ Z (zsh) . Đồng thời, C shell có các danh mục phụ của riêng nó như C shell (csh)Vỏ TENEX C (tcsh) . Như đã đề cập ở trên, trong số tất cả các vỏ, Bash (Bourne lại vỏ) là shell được sử dụng rộng rãi nhất và có sẵn trong nhiều bản phân phối Linux vì tính hiệu quả và thân thiện với người dùng của nó.



Bash là trình bao mặc định của nhiều bản phân phối Linux và được sử dụng rộng rãi bởi hàng triệu người dùng Linux. Nó rất đa dạng và có ảnh hưởng đến mức nó có thể thực hiện mọi tác vụ bạn thường thực hiện trong các ứng dụng dựa trên GUI. Bạn có thể chỉnh sửa tệp, quản lý tệp, xem ảnh, nghe nhạc, phát video và hơn thế nữa.





Tập lệnh Shell là gì:

Như chúng ta đã tìm hiểu ý tưởng cơ bản về shell, bây giờ chúng ta hãy chuyển sang viết script shell. Tập lệnh shell là một chương trình máy tính thực hiện nhiều lệnh trong một shell hoạt động như một trình thông dịch để thực hiện một chức năng cụ thể. Như đã thảo luận ở trên, có 2 loại vỏ cụ thể. Tuy nhiên, hướng dẫn này đang tập trung vào lớp vỏ Bourne Again (Bash).
Vậy bash script là gì? Trong Linux, tất cả các lệnh bash được lưu trữ trong / usr / bin và / bin thư mục. Ví dụ: bất cứ khi nào bạn chạy một lệnh, hãy tìm kiếm xem nó có tồn tại trong thư mục hay không. Lệnh được thực thi nếu nó tìm thấy trong các thư mục khác có lỗi.

Làm thế nào về việc thực hiện một tác vụ cần nhiều lệnh để chạy trong thiết bị đầu cuối? Trong tình huống cụ thể này, tập lệnh bash có thể giúp bạn. Bash scripting là một dạng của shell script cho phép bạn tạo các chương trình chạy nhiều lệnh bash để thực hiện một tác vụ cụ thể.



Lỗi trong kịch bản bash là gì:

Trong khi làm việc với bash scripting hoặc với bất kỳ ngôn ngữ lập trình nào khác, bạn gặp phải nhiều lỗi. Lỗi là một lỗi hoặc một lỗi trong chương trình có thể khiến chương trình hoạt động không chính xác.

Mọi ngôn ngữ lập trình đều có quy trình riêng để tìm lỗi; tương tự, bash cũng có nhiều tùy chọn tích hợp để gỡ lỗi một chương trình đầu cuối.

Quản lý lỗi và gỡ lỗi một chương trình không kém phần phức tạp. Đây là một công việc tốn thời gian và có thể trở nên tồi tệ hơn nếu bạn không biết các công cụ phù hợp để gỡ lỗi chương trình của mình. Bài viết này là một hướng dẫn đầy đủ về cách gỡ lỗi các tập lệnh bash để làm cho tập lệnh của bạn không bị lỗi. Vì vậy, hãy bắt đầu:

Cách gỡ lỗi tập lệnh bash:

Khi bạn làm việc trên các dự án lập trình lớn, bạn gặp phải nhiều lỗi hoặc lỗi. Gỡ lỗi một chương trình đôi khi có thể phức tạp. Các lập trình viên thường sử dụng các công cụ gỡ lỗi và nhiều trình chỉnh sửa mã cũng hỗ trợ tìm lỗi bằng cách tô sáng cú pháp.

Có nhiều công cụ khác nhau trong Linux để gỡ lỗi mã, ví dụ, GNU Debugger hay còn gọi là gdb. Các công cụ như GDB rất hữu ích cho các ngôn ngữ lập trình biên dịch thành mã nhị phân. Vì bash là một ngôn ngữ được thông dịch đơn giản nên không cần các công cụ nặng để gỡ lỗi nó.

Có nhiều kỹ thuật truyền thống khác nhau để gỡ lỗi mã tập lệnh bash và một trong số chúng là thêm Khẳng định. Assertions là các điều kiện được thêm vào trong chương trình để kiểm tra các điều kiện cụ thể và thực hiện chương trình cho phù hợp. Nó là một kỹ thuật phòng thủ cũng giúp tìm ra lỗi và kiểm tra. Bạn có thể tìm thấy nhiều công cụ hỗ trợ thêm xác nhận trong tập lệnh bash.

Vâng, thêm khẳng định là một trong những kỹ thuật truyền thống cũ. Có các bộ cờ / tùy chọn có sẵn trong bash để gỡ lỗi một tập lệnh bash. Các tùy chọn này có thể được thêm vào cùng với shebang trong các tập lệnh hoặc được thêm vào trong khi thực hiện chương trình trong thiết bị đầu cuối. Các chủ đề chúng tôi sẽ đề cập đến được liệt kê dưới đây:

  1. Cách gỡ lỗi tập lệnh bash bằng cách bật tiết -v Lựa chọn
  2. Cách gỡ lỗi tập lệnh bash bằng cách sử dụng xtrace -x Lựa chọn
  3. Cách gỡ lỗi tập lệnh bash bằng cách sử dụng noexec -n Lựa chọn
  4. Làm thế nào để xác định bỏ đặt biến trong khi gỡ lỗi tập lệnh bash
  5. Làm thế nào để gỡ lỗi phần cụ thể của tập lệnh bash
  6. Cách gỡ lỗi tập lệnh bash bằng cách sử dụng cạm bẫy chỉ huy
  7. Cách gỡ lỗi tập lệnh bash bằng cách loại bỏ tập tin bóng sử dụng -NS Lựa chọn
  8. Làm cách nào để phối hợp gỡ lỗi các tùy chọn để gỡ lỗi một tập lệnh shell
  9. Làm cách nào để báo cáo gỡ lỗi chuyển hướng vào một tập tin

Vì vậy, hãy kiểm tra các kỹ thuật khác nhau trong bash để gỡ lỗi tập lệnh bash:

1. Cách gỡ lỗi tập lệnh bash bằng cách bật tùy chọn verbose -v:

Một trong những cách tiếp cận dễ nhất để gỡ lỗi tập lệnh bash là sử dụng -v tùy chọn, còn được gọi là tiết. Tùy chọn có thể được thêm với shebang hoặc đặt tên tệp script một cách rõ ràng trong khi thực thi nó. Tùy chọn verbose sẽ thực thi và in mọi dòng mã như một quá trình của trình thông dịch. Hãy hiểu nó với một ví dụ về tập lệnh bash:

#! / bin / bash
quăng đi 'Nhập số 1'
đọcsố 1
quăng đi 'Nhập số 2'
đọcsố 2
nếu như [ '$ number1' -gt '$ number2' ]
sau đó
quăng đi 'Number1 lớn hơn Number2'
elif [ '$ number1' -eq '$ number2' ]
sau đó
quăng đi 'Number1 bằng Number2'
khác
quăng đi 'Number2 lớn hơn Number1'
thì là ở

Đoạn mã trên đang lấy hai số từ người dùng và sau đó thực hiện một số câu lệnh điều kiện để kiểm tra xem số này có ý nghĩa hơn, nhỏ hơn hay bằng số đã nhập khác. Mặc dù có thể sử dụng bất kỳ trình soạn thảo văn bản nào để viết kịch bản bash, nhưng tôi đang sử dụng trình soạn thảo Vim. Vim là một trình soạn thảo mạnh mẽ, giàu tính năng, làm nổi bật cú pháp của các tập lệnh bash và giảm nguy cơ lỗi cú pháp. Nếu bạn không có trình chỉnh sửa Vim, hãy tải nó bằng cách chạy lệnh được đề cập bên dưới:

$sudođúng cáchTải về tôi đã đến

Tạo tệp kịch bản bash bằng cách sử dụng:

$tôi đã đếnb_script.sh

Nếu bạn chưa quen với trình soạn thảo Vim, tôi khuyên bạn nên tìm hiểu cách sử dụng trình soạn thảo vim trước khi tiếp tục.

Bây giờ, quay lại tập lệnh, hãy thực thi tập lệnh bằng cách sử dụng -v Lựa chọn:

$bấu víu -vb_script.sh

Có thể thấy trong đầu ra ở trên rằng mỗi dòng của tập lệnh được in trong thiết bị đầu cuối khi chúng xử lý bởi trình thông dịch. Lưu ý rằng tập lệnh sẽ ngừng lấy đầu vào từ người dùng và sau đó xử lý dòng tiếp theo của tập lệnh. Như đã thảo luận ở trên rằng -v tùy chọn có thể được đặt sau shebang như thể hiện trong hình sau:

#! / bin / bash -v

Tương tự, cờ tiết cũng có thể được thêm vào dòng tiếp theo của shebang bằng cách sử dụng bộ chỉ huy:

#! / bin / bash
bộ -v

Bất kỳ phương pháp nào được thảo luận ở trên đều có thể kích hoạt chi tiết.

2 Cách gỡ lỗi tập lệnh bash bằng tùy chọn xtrace -x:

Theo dõi thực thi, còn được gọi là xtrace là một tùy chọn gỡ lỗi thông minh và hữu ích, đặc biệt là để theo dõi các lỗi logic. Các lỗi logic thường được kết hợp với các biến và lệnh. Để kiểm tra trạng thái của biến trong quá trình thực thi tập lệnh, chúng tôi sử dụng -NS Lựa chọn. Bây giờ một lần nữa, chạy b_script.sh nộp hồ sơ với -NS lá cờ:

$bấu víu -NSb_script.sh

Đầu ra hiển thị rõ ràng giá trị của mỗi biến trong quá trình thực thi. Một lần nữa, -NS có thể được sử dụng bên cạnh shebang và sau dòng shebang bằng cách sử dụng lệnh set. Xtrace đặt dấu + ở mỗi dòng của script.

3 Cách gỡ lỗi tập lệnh bash bằng tùy chọn noexec -n:

Lỗi cú pháp là một trong những nguyên nhân chính gây ra lỗi. Để gỡ lỗi cú pháp tập lệnh bash, chúng tôi sử dụng noexec (không thực hiện) chế độ. Tùy chọn được sử dụng cho chế độ noexec là -n. Nó sẽ chỉ hiển thị các lỗi cú pháp của mã thay vì thực thi nó. Một cách tiếp cận an toàn hơn nhiều để gỡ lỗi mã. Hãy thực hiện b_script.sh một lần nữa với -n Lựa chọn:

$bấu víu -nb_script.sh

Sẽ không có việc thực thi mã nếu không có lỗi cú pháp. Bây giờ, hãy sửa đổi mã của chúng ta:

#! / bin / bash

quăng đi 'Nhập số 1'
đọcsố 1
quăng đi 'Nhập số 2'
đọcsố 2
nếu như [ '$ number1' -gt '$ number2' ]
sau đó
quăng đi 'Number1 lớn hơn Number2'
elif [ '$ number1' -eq '$ number2' ]
#sau đó
quăng đi 'Number1 bằng Number2'
khác
quăng đi 'Number2 lớn hơn Number1'
thì là ở

Tôi đang bình luận sau đó sau elif . Bây giờ, với -n thực thi b_script.sh kịch bản:

$bấu víu -nb_script.sh

Như dự đoán, nó đã xác định rõ ràng lỗi và hiển thị nó trong thiết bị đầu cuối.

4 Cách xác định các biến chưa được đặt trong khi gỡ lỗi tập lệnh bash:

Việc mắc lỗi đánh máy trong khi viết mã là điều phổ biến. Thông thường, bạn gõ nhầm một biến, biến này không cho phép mã thực thi. Để xác định một lỗi như vậy, chúng tôi sử dụng -u Lựa chọn. Hãy sửa đổi mã một lần nữa:

#! / bin / bash
quăng đi 'Nhập số 1'
đọcsố 1
quăng đi 'Nhập số 2'
đọcsố 2
nếu như [ '$ num1' -gt '$ number2' ]
sau đó
quăng đi 'Number1 lớn hơn Number2'
elif [ '$ number1' -eq '$ number2' ]
sau đó
quăng đi 'Number1 bằng Number2'
khác
quăng đi 'Number2 lớn hơn Number1'
thì là ở

Trước hết nếu như câu lệnh điều kiện, tôi đã đổi tên số 1 biến thành num1 . Bây giờ num1 là một biến chưa được đặt. Bây giờ hãy chạy tập lệnh:

$bấu víu -ub_script.sh

Đầu ra đã xác định và hiển thị rõ ràng tên của một biến chưa được đặt.

5. Cách gỡ lỗi phần cụ thể của tập lệnh bash:

Chế độ xtrace xử lý mọi dòng mã và đưa ra đầu ra. Tuy nhiên, việc tìm lỗi trong một đoạn mã lớn sẽ tốn nhiều thời gian nếu chúng ta đã biết phần nào có khả năng gây ra lỗi. May mắn thay, xtrace cũng cho phép bạn gỡ lỗi một phần cụ thể của mã, có thể được thực hiện bằng cách sử dụng bộ chỉ huy. Địa điểm set -x ở đầu phần cần được gỡ lỗi và sau đó đặt + x cuối cùng. Ví dụ: tôi muốn gỡ lỗi các câu lệnh điều kiện của b_script.sh , vì vậy tôi sẽ gửi kèm tất cả các câu lệnh điều kiện trong set -xđặt + x các tùy chọn như được hiển thị trong mã bên dưới:

#! / bin / bash
quăng đi 'Nhập số 1'
đọcsố 1
quăng đi 'Nhập số 2'
đọcsố 2
bộ -NS
nếu như [ '$ số' -gt '$ number2' ]
sau đó
quăng đi 'Number1 lớn hơn Number2'
elif [ '$ number1' -eq '$ number2' ]
sau đó
quăng đi 'Number1 bằng Number2'
khác
quăng đi 'Number2 lớn hơn Number1'
thì là ở
bộ+ x

Bây giờ, hãy chạy tập lệnh bằng cách sử dụng bash b_script.sh .

Đầu ra chỉ gỡ lỗi các điều kiện if như được chỉ định.

6. Cách gỡ lỗi tập lệnh bash bằng lệnh bẫy:

Nếu tập lệnh của bạn phức tạp, thì cũng có nhiều kỹ thuật phức tạp hơn để gỡ lỗi. Một trong số đó là cạm bẫy chỉ huy. Các cạm bẫy lệnh bắt tín hiệu và thực hiện lệnh khi một tình huống cụ thể xảy ra. Lệnh có thể là một tín hiệu hoặc một hàm. Tôi đã tạo một tập lệnh khác có tên là sum_script.sh :

#! / bin / bash
cạm bẫy 'echo' Dòng $ {LINENO}: Số đầu tiên là $ number1, Số thứ hai là $ number2 và tổng là $ sum ''NỢ
quăng đi 'Nhập số đầu tiên'
đọcsố 1
quăng đi 'Nhập số thứ hai'
đọcsố 2
Tổng= $[number1 + number2]
quăng đi 'tổng là$ sum'

Các cạm bẫy ra lệnh với NỢ tín hiệu hiển thị trạng thái của các biến số 1 , số 2Tổng sau khi thực hiện mỗi dòng như thể hiện trong hình ảnh đầu ra sau:

Các khối màu vàng là khoảng trống vì người dùng chưa nhập không có đầu vào; các khoảng trống này sẽ lấp đầy khi người dùng nhập các giá trị. Phương pháp này cũng khá hữu ích trong việc gỡ lỗi các tập lệnh bash.

7. Làm thế nào để gỡ lỗi một tập lệnh bash bằng cách loại bỏ sự lấp lánh của tệp bằng cách sử dụng tùy chọn -f:

File Globbing là một quá trình tìm kiếm các tệp có các ký tự đại diện, tức là *? . Trong nhiều trường hợp, bạn không cần phải mở rộng tệp trong khi gỡ lỗi. Trong những trường hợp như vậy, bạn có thể chặn tệp lấp lánh bằng cách sử dụng -NS Lựa chọn. Hãy hiểu nó bằng một tập lệnh fglobe_script.sh :

#! / bin / bash
quăng đi 'Hiển thị tất cả các tệp văn bản.'
ls *.txt

Đoạn mã trên sẽ hiển thị tất cả các tệp văn bản trong thư mục hiện tại, thực thi:

$bấu víufglobe_script.sh

Để tắt chế độ hiển thị tệp, hãy sử dụng -NS Lựa chọn:

$bấu víu -NSfglobe_script.sh

Tương tự, bạn có thể sử dụng nó với shebang và với bộ lệnh cũng như:

#! / bin / bash
quăng đi 'Hiển thị tất cả các tệp văn bản.'
ls *.txt
bộ -NS
quăng đi 'Hiển thị tất cả các tệp văn bản'
ls *.txt
bộ+ f

Bây giờ, chạy bash fglobe_script.sh:

Phần kèm theo set -f / set + f các tùy chọn không xử lý các lệnh có ký tự đại diện.

8. Cách kết hợp các tùy chọn gỡ lỗi để gỡ lỗi shell script:

Chúng tôi chỉ sử dụng một tùy chọn trong các kỹ thuật gỡ lỗi nêu trên, nhưng chúng tôi có thể kết hợp nhiều tùy chọn khác nhau để hiểu rõ hơn. Hãy triển khai -NS-v các tùy chọn cho sum_script.sh kịch bản. Tôi đang sử dụng sum_script.sh kịch bản.

#! / bin / bash
quăng đi 'Nhập số đầu tiên'
đọcsố 1
quăng đi 'Nhập số thứ hai'
đọcsố 2
Tổng= $[number1 + number2]
quăng đi 'tổng là$ sum'

Bây giờ thực hiện:

$bấu víu -xvsum_script.sh

Cả hai -NS-v kết quả đầu ra được kết hợp, như được hiển thị trong hình ảnh đầu ra. Tương tự, chúng ta cũng có thể kết hợp -u tùy chọn với chi tiết -v để phát hiện lỗi. Tôi đang thay thế số 1 biến với trên một trong dòng thứ sáu của script:

#! / bin / bash
$ number2Tổng$ sum'' NỢ
quăng đi '
Nhập số đầu tiên'
đọc số 1
quăng đi '
Nhập số thứ hai'
đọc số 2
sum = $ [num + number2]
quăng đi '
NSTổng$ sum'

Để xem đầu ra, hãy chạy lệnh được đề cập bên dưới:

$bấu víu -uvsum_script.sh

9. Cách chuyển hướng báo cáo gỡ lỗi đến một tệp:

Lưu báo cáo gỡ lỗi của một tập lệnh bash vào một tệp có thể hữu ích trong nhiều trường hợp. Nó là một chút phức tạp vì để chuyển hướng báo cáo gỡ lỗi đến một tệp; chúng tôi sử dụng một số biến đặc biệt. Hãy triển khai nó trên b_script.sh mã số:

#! / bin / bash
người điều hành 5>dubug_report.log
BASH_XTRACED='5'
PS4='$ LINENO--'
quăng đi 'Nhập số 1'
đọcsố 1
quăng đi 'Nhập số 2'
đọcsố 2
nếu như [ '$ số' -gt '$ number2' ]
sau đó
quăng đi 'Number1 lớn hơn Number2'
elif [ '$ number1' -eq '$ number2' ]
sau đó
quăng đi 'Number1 bằng Number2'
khác
quăng đi 'Number2 lớn hơn Number1'
thì là ở

Trong dòng thứ hai của mã, có thể thấy rằng chúng tôi đang chuyển hướng đầu ra đến debug_report.log tập tin bằng cách sử dụng người điều hành lệnh với bộ mô tả tệp 5 (FD5).

thực thi 5> debug_report.log: Các người điều hành lệnh đang chuyển hướng mọi thứ xảy ra trong trình bao sang một tệp debug_report.log.

BASH_XTRACEFD = 5: Nó là một biến bash cụ thể và không thể được sử dụng trong bất kỳ trình bao nào khác. Nó cần được gán một bộ mô tả tệp hợp lệ và bash sẽ ghi kết quả được trích xuất vào debug_report.log.

PS4 = '$ LINENO– ‘: Nó cũng là một biến bash được sử dụng để in số dòng trong khi gỡ lỗi bằng chế độ xtrace. Giá trị mặc định của PS4 là dấu + ký tên

Tập lệnh trên đang tạo một tệp nhật ký có tên là debug_report.log, để đọc nó, hãy sử dụng con mèo chỉ huy:

Phần kết luận:

Mã có đầy lỗi có thể ảnh hưởng đến hiệu suất của chương trình và cũng có hại cho phần cứng. Gỡ lỗi là rất quan trọng đối với mọi chương trình vì nó làm cho chương trình hoạt động hiệu quả hơn. Việc tìm ra các lỗi hiện có và tiềm ẩn trong quá trình phát triển chương trình có thể ngăn chương trình của bạn hoạt động không mong muốn. Các mã lớn thường cần gỡ lỗi tích cực, nâng cao hiệu quả của mã bằng cách loại bỏ các đoạn mã tiêu tốn truy đòi.

Nhiều ngôn ngữ và môi trường lập trình có trình gỡ lỗi đồng hành của riêng chúng. Trong kịch bản bash, các kỹ thuật khác nhau có thể được triển khai để gỡ lỗi tập lệnh. Hướng dẫn này tập trung kỹ lưỡng vào tất cả các phương pháp có thể được sử dụng để tìm lỗi trong tập lệnh bash. Vì vậy, bất cứ khi nào bạn cảm thấy tập lệnh bash của mình không hoạt động như mong đợi, hãy sử dụng bất kỳ kỹ thuật nào được đề cập ở trên, nhưng chế độ xtrace (-x) khá hữu ích trong hầu hết các trường hợp.