Exec $@ có nghĩa là gì?

Khi chúng tôi tạo các tập lệnh Bash, chúng tôi có thể muốn chuyển hướng đầu ra của tất cả các câu lệnh echo vào một tệp nhật ký mà không chỉ định rõ ràng toán tử chuyển hướng và tên tệp nhật ký sau mỗi câu lệnh echo. Lệnh Bash là một tiện ích tích hợp mạnh mẽ có thể được sử dụng cho mục đích này

Trong hướng dẫn này, chúng ta sẽ xem cách chúng ta có thể sử dụng lệnh exec để thêm lỗi và ghi nhật ký đầu ra vào tập lệnh shell. Chúng ta cũng sẽ khám phá những cách sử dụng khác của lệnh này trong shell script

2. Những thứ cơ bản

Bất cứ khi nào chúng ta chạy bất kỳ lệnh nào trong trình bao Bash, thì một trình bao con được tạo theo mặc định và một tiến trình con mới được sinh ra [phân nhánh] để thực thi lệnh. Tuy nhiên, khi sử dụng exec, lệnh sau exec sẽ thay thế trình bao hiện tại. Điều này có nghĩa là không có lớp con nào được tạo và quy trình hiện tại được thay thế bằng lệnh mới này

Hãy chạy thử nghiệm để hiểu rõ hơn

$ pstree -p
init[1]─┬─init[52]───bash[53]
        ├─init[78]───bash[79]───pstree[108]
        └─{init}[7]
$ echo $$
79
$ exec sleep 300

Chúng tôi đã kiểm tra PID của shell hiện tại bằng lệnh echo $$ và pstree, sau đó thực hiện chế độ ngủ 300 giây bằng exec. Bây giờ hãy chuyển sang một thiết bị đầu cuối khác để kiểm tra danh sách quy trình

$ ps -aef | grep $USER
user1       53    52  0 23:37 tty2     00:00:00 -bash
user1       79    78  0 23:39 tty1     00:00:00 sleep 300
user1      111    53  0 23:40 tty2     00:00:00 ps -aef
user1      112    53  0 23:40 tty2     00:00:00 grep --color=auto 

Như chúng ta có thể thấy, PID 79, ban đầu được gán cho Bash, giờ được gán cho lệnh ngủ

Chúng ta cũng sẽ quan sát thấy rằng sau khi giấc ngủ 300 giây kết thúc, phiên [thiết bị đầu cuối], có PID 79, đã thoát do trình bao được thay thế bằng lệnh exec và quá trình thực thi của nó đã hoàn tất

3. Thay thế quy trình bằng lệnh exec

Ghi đè một quy trình hiện có bằng một lệnh khác có thể là một công cụ mạnh mẽ. Hãy khám phá ý tưởng này với một số ví dụ khác

3. 1. Hồ sơ đăng nhập người dùng

Giả sử Bash không phải là vỏ mặc định của hộp Linux của chúng tôi. Điều thú vị là sử dụng lệnh exec, chúng ta có thể thay thế shell mặc định trong bộ nhớ bằng shell Bash bằng cách thêm nó vào hồ sơ đăng nhập của người dùng

exec bash

Có những tình huống mà chúng tôi muốn thêm một chương trình hoặc menu cụ thể vào hồ sơ đăng nhập của người dùng [. bashrc hoặc. bash_profile] và trong những trường hợp như vậy, chúng tôi có thể ngăn người dùng truy cập dấu nhắc Bash sau khi chương trình thoát bất kể trạng thái thoát của nó

exec operations_menu.sh

3. 2. Các cuộc gọi chương trình trong tập lệnh

Chúng ta có thể gọi các tập lệnh hoặc các chương trình khác trong tập lệnh bằng lệnh exec để ghi đè lên quy trình hiện có trong bộ nhớ. Điều này giúp tiết kiệm số lượng quy trình được tạo và do đó tiết kiệm tài nguyên hệ thống. Việc triển khai này đặc biệt hữu ích trong trường hợp chúng tôi không muốn quay lại tập lệnh chính sau khi tập lệnh phụ hoặc chương trình được thực thi

#! /bin/bash

while true
do
   echo "1. Disk Stats "
   echo "2. Send Evening Report "
   read Input
   case "$Input" in
      1] exec df -kh ;;
      2] exec /home/SendReport.sh  ;;
   esac
done

Trong tập lệnh điều khiển đầu vào người dùng đơn giản này, chúng tôi đã thực thi lệnh df và tập lệnh bằng cách sử dụng exec trong các tùy chọn menu khác nhau

4. Bộ mô tả tệp và ghi nhật ký trong tập lệnh Shell bằng lệnh exec

Lệnh exec là một công cụ mạnh mẽ để thao tác các bộ mô tả tệp [FD], tạo đầu ra và ghi nhật ký lỗi trong các tập lệnh với một thay đổi tối thiểu. Trong Linux, theo mặc định, bộ mô tả tệp 0 là stdin [đầu vào tiêu chuẩn], 1 là thiết bị xuất chuẩn [đầu ra tiêu chuẩn] và 2 là stderr [lỗi tiêu chuẩn]

4. 1. Ghi nhật ký trong tập lệnh

Chúng tôi có thể tự động mở, đóng và sao chép thiết bị xuất chuẩn để đạt được các hoạt động ghi nhật ký. Hãy chuyển hướng thiết bị xuất chuẩn [FD 1] sang tệp nhật ký

#! /bin/bash
script_log="/tmp/log_`date +%F`.log"
exec 1>>$script_log
echo "This will be written into log file rather than terminal.."
echo "This too.."

Chúng tôi đã kiểm tra cách chúng tôi có thể ghi đầu ra tiêu chuẩn vào tệp, bây giờ hãy kiểm tra cách chúng tôi cũng có thể ghi lỗi tiêu chuẩn vào cùng một tệp

#! /bin/bash
script_log="/home/shubh/log_`date +%F`.log"
exec 1>>$script_log
exec 2>&1
datee
echo "Above command is wrong, error will be logged in log file"
date
echo "Output of correct date command will also be logged in log file, including these echo statements"

Ở đây, chúng tôi đã sao chép thiết bị xuất chuẩn [2] sang thiết bị xuất chuẩn [1] và thiết bị xuất chuẩn đã được thay đổi để ghi vào tệp nhật ký

4. 2. Thay đổi Stdin để đọc từ một tệp

Hãy tạo một tệp đầu vào mẫu

$ cat input_csv
SNo,Quantity,Price,Value
1,2,20,40
2,5,10,50
3,1,70,70

Bây giờ hãy chạy một ví dụ để đọc từ tệp chúng tôi đã tạo

________số 8

Và đây là những gì chúng ta nhận được

The contents of first line are: SNo,Quantity,Price,Value
The contents of second line are: 1,2,20,40

4. 3. Thay đổi bộ mô tả tệp và khôi phục mặc định

Chúng tôi cũng có thể mở và đóng các bộ mô tả tệp mới để đọc và ghi từ tệp. Hãy sử dụng cùng một tệp đầu vào như trong phần trước để chứng minh điều này

$ ps -aef | grep $USER
user1       53    52  0 23:37 tty2     00:00:00 -bash
user1       79    78  0 23:39 tty1     00:00:00 sleep 300
user1      111    53  0 23:40 tty2     00:00:00 ps -aef
user1      112    53  0 23:40 tty2     00:00:00 grep --color=auto 
0

Ở đây, lần đầu tiên chúng tôi mở tệp đầu vào trên FD 3, đọc từ tệp và in nội dung của nó trên thiết bị đầu cuối [mặc định là thiết bị xuất chuẩn]. Cuối cùng, chúng tôi đã sử dụng &- để đóng FD 3. Khi tập lệnh này thực thi với đầu ra sau

$ ps -aef | grep $USER
user1       53    52  0 23:37 tty2     00:00:00 -bash
user1       79    78  0 23:39 tty1     00:00:00 sleep 300
user1      111    53  0 23:40 tty2     00:00:00 ps -aef
user1      112    53  0 23:40 tty2     00:00:00 grep --color=auto 
1

Ngoài ra, tập lệnh cũng tạo một tệp đầu ra. txt

$ ps -aef | grep $USER
user1       53    52  0 23:37 tty2     00:00:00 -bash
user1       79    78  0 23:39 tty1     00:00:00 sleep 300
user1      111    53  0 23:40 tty2     00:00:00 ps -aef
user1      112    53  0 23:40 tty2     00:00:00 grep --color=auto 
2

Lưu ý rằng đầu ra của tập lệnh chỉ chứa câu lệnh echo đầu tiên. Thật thú vị, sau câu lệnh echo đầu tiên, chúng tôi đã sao chép thiết bị xuất chuẩn sang FD 4 và chuyển hướng nó sang một tệp khác. Sau đó, ở dòng cuối cùng, chúng tôi đã lấy lại quyền truy cập vào thiết bị xuất chuẩn bằng cách đóng FD 4

5. Chạy tập lệnh trong môi trường sạch

Chúng tôi có thể đặt lại tất cả các biến môi trường để chạy sạch bằng tùy chọn -c

$ ps -aef | grep $USER
user1       53    52  0 23:37 tty2     00:00:00 -bash
user1       79    78  0 23:39 tty1     00:00:00 sleep 300
user1      111    53  0 23:40 tty2     00:00:00 ps -aef
user1      112    53  0 23:40 tty2     00:00:00 grep --color=auto 
3

Khi lệnh printenv liệt kê các biến môi trường, đặt nó làm đối số cho lệnh exec tại đây sẽ in một đầu ra trống

6. Sử dụng Với Lệnh Tìm

Tùy chọn exec có thể được sử dụng để thực hiện các thao tác như grep, cat, mv, cp, rm, v.v. trên các tệp được tìm thấy bằng lệnh find. Hãy sử dụng một ví dụ từ bài viết của chúng tôi về lệnh find để tìm tất cả. các tệp java chứa từ “giao diện” trong thư mục “src”

$ ps -aef | grep $USER
user1       53    52  0 23:37 tty2     00:00:00 -bash
user1       79    78  0 23:39 tty1     00:00:00 sleep 300
user1      111    53  0 23:40 tty2     00:00:00 ps -aef
user1      112    53  0 23:40 tty2     00:00:00 grep --color=auto 
4

Ở đây, chúng tôi đã chỉ định tùy chọn -type f  để chỉ tìm các tệp thông thường. Sau đó, chúng tôi đã sử dụng tùy chọn -exec để thực thi lệnh grep trên danh sách các tệp được trả về bởi lệnh find. Lưu ý rằng dấu chấm phẩy ở cuối khiến lệnh grep được thực thi cho từng tệp, mỗi lần một tệp vì {} được thay thế bằng tên tệp hiện tại. Cũng lưu ý rằng cần có dấu gạch chéo ngược để thoát dấu chấm phẩy khỏi bị trình bao giải thích

7. Phần kết luận

Trong hướng dẫn này, chúng ta đã thấy các cách sử dụng khác nhau của lệnh exec tích hợp Bash trong shell script

Nói một cách đơn giản, đó là một công cụ mạnh mẽ để thay thế quy trình. Cụ thể, việc sử dụng nó với các bộ mô tả tệp trong tập lệnh khiến nó trở thành một trong những công cụ mạnh mẽ nhất hiện có để ghi nhật ký tập lệnh linh hoạt

tác giả dưới cùng

Nếu bạn có một vài năm kinh nghiệm trong hệ sinh thái Linux và bạn muốn chia sẻ trải nghiệm đó với cộng đồng, hãy xem Nguyên tắc đóng góp của chúng tôi

$@ nghĩa là gì trong Linux?

$@ tham chiếu đến tất cả các đối số dòng lệnh của tập lệnh shell . $1 , $2 , v.v. , tham khảo đối số dòng lệnh đầu tiên, đối số dòng lệnh thứ hai, v.v. Đặt các biến trong dấu ngoặc kép nếu các giá trị có thể có khoảng trắng trong đó.

Tập lệnh bash $@ là gì?

Tập lệnh Bash là gì? . Chúng được đọc và thực thi bởi chương trình bash. Chương trình thực hiện từng dòng một. Ví dụ: bạn có thể điều hướng đến một đường dẫn nhất định, tạo một thư mục và sinh ra một quy trình bên trong nó bằng dòng lệnh. a series of commands written in a file. These are read and executed by the bash program. The program executes line by line. For example, you can navigate to a certain path, create a folder and spawn a process inside it using the command line.

$@ và $* trong shell script là gì?

$# - Để kiểm tra số lượng [số lượng đối số] trong tập lệnh. • $* - Nó lưu trữ bộ tham số vị trí hoàn chỉnh trong một chuỗi . • $@ - Chuỗi trích dẫn được coi là đối số riêng biệt. • $? .

Đâu là sự khác biệt giữa $* và $@?

$* Lưu trữ tất cả các đối số được nhập trên dòng lệnh [$1 $2. ]. "$@" Lưu trữ tất cả các đối số được nhập trên dòng lệnh, được trích dẫn riêng ["$1" "$2". ] .

Chủ Đề