Công dụng của Lệnh Exec trong Shell Scripts

Cong Dung Cua Lenh Exec Trong Shell Scripts



Hướng dẫn này giải thích chi tiết về lệnh exec và cách sử dụng nó trong tập lệnh shell.

điều kiện tiên quyết:

Để thực hiện các bước được trình bày trong hướng dẫn này, bạn cần có các thành phần sau:

  • Một hệ thống Linux chức năng. Học nhiều hơn về thiết lập máy ảo Ubuntu bằng VirtualBox .
  • Truy cập vào một người dùng không phải root với đặc quyền sudo .
  • Một trình soạn thảo văn bản phù hợp. Ví dụ: Tại sao / NeoVim , nano , Văn bản tuyệt vời , VSCodium , vân vân.

Lệnh thực thi

Bản thân lệnh exec không phải là một công cụ riêng biệt:







$ cái mà giám đốc điều hành



Thay vào đó, nó là một lệnh nội bộ của Bash shell:



$ người đàn ông giám đốc điều hành





Như mô tả từ trang hướng dẫn gợi ý, nếu một lệnh được chỉ định, exec sẽ thay thế trình bao bằng lệnh đó, không sinh ra quy trình bổ sung nào. Có một số tùy chọn có sẵn để sửa đổi hành vi của lệnh exec.



Sử dụng cơ bản

Theo mặc định, bất cứ khi nào chạy một lệnh, Bash sẽ sinh ra một subshell và rẽ nhánh lệnh.

$ tiếng vang $$ && ngủ 999

$ pstree -P

Tại đây, lệnh echo in PID của trình bao hiện tại. Shell Bash (PID: 978) sinh ra một tiến trình con mới để hoạt động với lệnh ngủ (PID: 8369).

Bây giờ, nếu chúng ta chạy lệnh ngủ bằng exec thì sao?

$ tiếng vang $$ && giám đốc điều hành ngủ 999

$ pstree -p

Quá trình Bash gốc được thay thế bằng lệnh ngủ. Sau khi thực hiện thành công, nó không quay trở lại trình bao. Thay vào đó, phiên kết thúc.

Môi trường sạch

Cấu hình Bash mặc định đi kèm với một loạt các chỉnh sửa và biến môi trường. Trong một số trường hợp nhất định (ví dụ: gỡ lỗi), bạn có thể muốn chạy tập lệnh/chương trình của mình trong một môi trường sạch. Với sự trợ giúp của exec, chúng ta có thể khởi chạy một phiên bản shell sạch thay cho phiên bản hiện tại.

Đầu tiên, sử dụng lệnh printenv để liệt kê tất cả các biến môi trường hiện được cấu hình:

$ inenv

Bây giờ, hãy sử dụng exec để khởi chạy một phiên bản sạch:

$ giám đốc điều hành -c đánh đập

$ printenv

Ra mắt Shell khác

Ngoài Bash và “sh”, còn có nhiều chương trình shell khác, mỗi chương trình đều có những đặc quyền riêng. Nếu một chương trình/tập lệnh yêu cầu một shell cụ thể, bạn có thể sử dụng exec để thay thế shell Bash hiện tại bằng shell mong muốn.

Trong ví dụ sau, chúng tôi thay thế Bash bằng “sh”:

$ pstree -P

$ giám đốc điều hành sh

$ pstree -P

Sử dụng Exec trong Tập lệnh

Với những điều cơ bản đã sẵn sàng, giờ đây chúng ta có thể bắt đầu sử dụng exec trong các tập lệnh shell của mình.

Ví dụ 1: Làm việc với các Shell khác nhau

Kiểm tra đoạn script sau:

#!/bin/bash

tiếng vang $SHELL

tiếng vang 'echo zsh đã khởi chạy thành công' > zsh.sh

giám đốc điều hành zsh zsh.sh

Ở đây, lệnh echo đầu tiên in shell hiện tại. Theo mặc định, nó phải là Bash. Sau đó, lệnh exec khởi chạy “zsh” để thực thi tập lệnh “zsh.sh”.

Chạy đoạn script sau:

$ . / kiểm tra.sh

Ví dụ 2: Ghi đè quy trình hiện có

Bất cứ khi nào gọi một lệnh/chương trình, Bash sẽ sinh ra một quy trình mới. Trong hầu hết các tình huống, đó không phải là vấn đề đáng lo ngại. Tuy nhiên, khi làm việc với một hệ thống có tài nguyên rất hạn chế (ví dụ: phần cứng nhúng), sử dụng exec để ghi đè lên quy trình hiện có trong bộ nhớ có thể hữu ích.

Kiểm tra đoạn script sau:

#!/bin/bash

pstree -P

giám đốc điều hành pstree -P

tiếng vang 'Chào thế giới'

Ở đây, lệnh pstree đầu tiên hiển thị bố cục ban đầu của cây quy trình. Khi lệnh exec được thực thi, lệnh pstree thứ hai sẽ thay thế trình bao đang chạy. Lệnh echo ở dòng cuối cùng không thực thi.

Chạy đoạn script sau:

$ . / kiểm tra.sh

Vì nó là một phần của tập lệnh, chúng tôi sẽ quay lại trình bao ban đầu sau khi thực thi thành công.

Khi lệnh exec thay thế trình bao gốc bằng một lệnh/chương trình khác, bất kỳ mã nào sau đó sẽ trở nên không hợp lệ. Hãy cẩn thận khi sử dụng chúng trong tập lệnh của bạn.

Ví dụ 3: Ghi nhật ký

Shell Bash cung cấp 3 bộ mô tả tệp duy nhất cho bất kỳ chương trình/tập lệnh đang chạy nào:

  • STDOUT (1): đầu ra tiêu chuẩn, lưu trữ đầu ra bình thường
  • STDERR (2): lỗi tiêu chuẩn, lưu trữ các thông báo lỗi
  • STDIN (0): đầu vào tiêu chuẩn

Sử dụng exec, chúng ta có thể chuyển hướng các bộ mô tả tệp này đến một vị trí khác, ví dụ: tệp nhật ký. Nó có thể giúp gỡ lỗi và ghi nhật ký nói chung.

Nói chung, nếu bạn muốn chuyển hướng STDOUT và STDERR sang tệp nhật ký, bạn sử dụng toán tử chuyển hướng:

$ tiếng vang $$ | phát bóng kiểm tra.log

$ sư 2 >& 1 | phát bóng kiểm tra.log

Phương pháp này yêu cầu chuyển hướng tại mọi điểm mà bạn muốn đăng nhập. Để giải quyết vấn đề này, chúng ta có thể sử dụng lệnh exec để tạo chuyển hướng vĩnh viễn cho phiên shell. Kiểm tra ví dụ sau:

#!/bin/bash

> kiểm tra.log

giám đốc điều hành 1 >> kiểm tra.log

giám đốc điều hành 2 >& 1

tiếng vang 'Chào thế giới'

sai_command

Ở đây, dòng đầu tiên tạo một tệp nhật ký trống. Lệnh exec đầu tiên thiết lập chuyển hướng vĩnh viễn STDOUT sang tệp nhật ký. Lệnh exec thứ hai chuyển hướng STDERR sang STDOUT.

Với thiết lập này, tất cả các đầu ra và thông báo lỗi được đưa vào tệp nhật ký:

$ . / kiểm tra.sh

$ con mèo kiểm tra.log

Điều gì xảy ra nếu tập lệnh tạo các mục nhật ký liên tục?

#!/bin/bash

> kiểm tra.log

giám đốc điều hành 1 >> kiểm tra.log

giám đốc điều hành 2 >& 1

trong khi ĐÚNG VẬY

LÀM

tiếng vang $NGẪU NHIÊN

ngủ 5

xong

Ở đây, trong phần đầu tiên, chúng tôi tạo một chuyển hướng vĩnh viễn của STDOUT và STDERR tới tệp nhật ký của chúng tôi. Vòng lặp while vô hạn chạy lệnh echo cho đến khi chúng ta đóng nó bằng cách sử dụng “Ctrl + C”. Biến $RANDOM là một biến đặc biệt trả về một chuỗi ngẫu nhiên mỗi khi nó được truy cập.

Để kiểm tra mục nhật ký cập nhật, hãy sử dụng lệnh đuôi sau:

$ đuôi -f kiểm tra.log

Lưu ý rằng chuyển hướng này chỉ kéo dài trong phiên trình bao.

Ví dụ 4: Nhập từ Tệp

Tương tự như cách chúng tôi tạo chuyển hướng STDOUT và STDERR vĩnh viễn, chúng tôi cũng có thể tạo một chuyển hướng cho STDIN. Tuy nhiên, vì STDIN được sử dụng cho đầu vào nên việc triển khai có một chút khác biệt.

Trong tập lệnh sau, chúng tôi lấy STDIN từ một tệp:

#!/bin/bash

tiếng vang 'tiếng vang' Chào thế giới '' > đầu vào

giám đốc điều hành < đầu vào

đọc dòng 1

đánh giá $line_1

Ở đây, trong dòng đầu tiên, chúng tôi sử dụng tiếng vang để tạo nội dung của tệp input_string bằng cách sử dụng chuyển hướng. Lệnh exec chuyển hướng nội dung của input_string sang STDIN của phiên shell hiện tại. Sau khi đọc chuỗi, chúng tôi sử dụng eval để xử lý nội dung của $line_1 dưới dạng mã trình bao.

Chạy đoạn script sau:

$ . / kiểm tra.sh

Phần kết luận

Chúng ta đã thảo luận về lệnh exec trong Bash. Chúng tôi cũng giới thiệu nhiều cách khác nhau để sử dụng nó trong tập lệnh. Chúng tôi đã chứng minh việc sử dụng exec để làm việc với nhiều trình bao, tạo các tập lệnh hiệu quả về bộ nhớ và chuyển hướng các bộ mô tả tệp.

Đây chỉ là một phần nhỏ của những gì có thể đạt được bằng cách sử dụng tập lệnh Bash. Tìm hiểu thêm về tập lệnh Bash từ lập trình bash tiểu mục.

Chúc bạn tính toán vui vẻ!