Unix / Linux - Chuyển hướng đầu vào / đầu ra của Shell

Trong chương này, chúng ta sẽ thảo luận chi tiết về chuyển hướng đầu vào / đầu ra của Shell. Hầu hết các lệnh hệ thống Unix lấy đầu vào từ thiết bị đầu cuối của bạn và gửi kết quả đầu ra trở lại thiết bị đầu cuối của bạn. Một lệnh thường đọc đầu vào của nó từ đầu vào chuẩn, đây sẽ là thiết bị đầu cuối của bạn theo mặc định. Tương tự, một lệnh thường ghi đầu ra của nó thành đầu ra chuẩn, theo mặc định, lệnh này lại là thiết bị đầu cuối của bạn.

Chuyển hướng đầu ra

Thay vào đó, kết quả đầu ra từ một lệnh thường dành cho đầu ra tiêu chuẩn có thể dễ dàng chuyển hướng sang một tệp. Khả năng này được gọi là chuyển hướng đầu ra.

Nếu ký hiệu> tệp được nối vào bất kỳ lệnh nào thường ghi đầu ra của nó vào đầu ra chuẩn, đầu ra của lệnh đó sẽ được ghi vào tệp thay vì đầu cuối của bạn.

Kiểm tra lượt theo dõi who lệnh chuyển hướng đầu ra hoàn chỉnh của lệnh trong tệp người dùng.

$ who > users

Chú ý rằng không có đầu ra nào xuất hiện ở đầu cuối. Điều này là do đầu ra đã được chuyển hướng từ thiết bị đầu ra tiêu chuẩn mặc định (thiết bị đầu cuối) thành tệp được chỉ định. Bạn có thể kiểm tra tệp người dùng để biết nội dung hoàn chỉnh -

$ cat users
oko         tty01   Sep 12 07:30
ai          tty15   Sep 12 13:32
ruth        tty21   Sep 12 10:10
pat         tty24   Sep 12 13:07
steve       tty25   Sep 12 13:03
$

Nếu một lệnh có đầu ra của nó được chuyển hướng đến một tệp và tệp đã chứa một số dữ liệu, dữ liệu đó sẽ bị mất. Hãy xem xét ví dụ sau:

$ echo line 1 > users
$ cat users
line 1
$

Bạn có thể sử dụng toán tử >> để nối đầu ra trong tệp hiện có như sau:

$ echo line 2 >> users
$ cat users
line 1
line 2
$

Chuyển hướng đầu vào

Giống như đầu ra của một lệnh có thể được chuyển hướng đến một tệp, do đó, đầu vào của lệnh có thể được chuyển hướng từ tệp. Nhưgreater-than character > được sử dụng để chuyển hướng đầu ra, less-than character < được sử dụng để chuyển hướng đầu vào của một lệnh.

Các lệnh thường lấy đầu vào của chúng từ đầu vào tiêu chuẩn có thể chuyển hướng đầu vào của chúng từ tệp theo cách này. Ví dụ, để đếm số dòng trong tệp người dùng đã tạo ở trên, bạn có thể thực hiện lệnh như sau:

$ wc -l users
2 users
$

Sau khi thực hiện, bạn sẽ nhận được kết quả sau. Bạn có thể đếm số dòng trong tệp bằng cách chuyển hướng đầu vào chuẩn củawclệnh từ người dùng tệp -

$ wc -l < users
2
$

Lưu ý rằng có sự khác biệt trong kết quả được tạo ra bởi hai dạng của lệnh wc. Trong trường hợp đầu tiên, tên của người dùng tệp được liệt kê với số dòng; trong trường hợp thứ hai, nó không phải là.

Trong trường hợp đầu tiên, wc biết rằng nó đang đọc đầu vào của nó từ người dùng tệp. Trong trường hợp thứ hai, nó chỉ biết rằng nó đang đọc đầu vào của nó từ đầu vào tiêu chuẩn nên nó không hiển thị tên tệp.

Đây là tài liệu

A here document được sử dụng để chuyển hướng đầu vào thành một chương trình hoặc tập lệnh shell tương tác.

Chúng ta có thể chạy một chương trình tương tác trong tập lệnh shell mà không cần người dùng thực hiện bằng cách cung cấp đầu vào cần thiết cho chương trình tương tác, hoặc tập lệnh shell tương tác.

Hình thức chung cho một here tài liệu là -

command << delimiter
document
delimiter

Ở đây shell diễn giải <<toán tử như một lệnh để đọc đầu vào cho đến khi nó tìm thấy một dòng chứa dấu phân cách được chỉ định. Tất cả các dòng đầu vào cho đến dòng chứa dấu phân cách sau đó sẽ được đưa vào đầu vào chuẩn của lệnh.

Dấu phân cách cho shell biết rằng heretài liệu đã hoàn thành. Nếu không có nó, shell tiếp tục đọc đầu vào mãi mãi. Dấu phân cách phải là một từ duy nhất không chứa dấu cách hoặc tab.

Sau đây là đầu vào cho lệnh wc -l để đếm tổng số dòng -

$wc -l << EOF
   This is a simple lookup program 
	for good (and bad) restaurants
	in Cape Town.
EOF
3
$

Bạn có thể dùng here document để in nhiều dòng bằng tập lệnh của bạn như sau:

#!/bin/sh

cat << EOF
This is a simple lookup program 
for good (and bad) restaurants
in Cape Town.
EOF

Khi thực hiện, bạn sẽ nhận được kết quả sau:

This is a simple lookup program
for good (and bad) restaurants
in Cape Town.

Tập lệnh sau chạy một phiên với vi trình soạn thảo văn bản và lưu đầu vào trong tệp test.txt.

#!/bin/sh

filename=test.txt
vi $filename <<EndOfCommands
i
This file was created automatically from
a shell script
^[
ZZ
EndOfCommands

Nếu bạn chạy tập lệnh này với vim đóng vai trò là vi, thì bạn có thể sẽ thấy đầu ra như sau:

$ sh test.sh
Vim: Warning: Input is not from a terminal
$

Sau khi chạy tập lệnh, bạn sẽ thấy phần sau được thêm vào tệp test.txt -

$ cat test.txt
This file was created automatically from
a shell script
$

Loại bỏ đầu ra

Đôi khi bạn sẽ cần thực hiện một lệnh, nhưng bạn không muốn kết quả hiển thị trên màn hình. Trong những trường hợp như vậy, bạn có thể hủy đầu ra bằng cách chuyển hướng nó đến tệp/dev/null -

$ command > /dev/null

Đây là tên của lệnh bạn muốn thực hiện. Tập tin/dev/null là một tập tin đặc biệt tự động loại bỏ tất cả đầu vào của nó.

Để loại bỏ cả đầu ra của một lệnh và đầu ra lỗi của nó, hãy sử dụng chuyển hướng tiêu chuẩn để chuyển hướng STDERR đến STDOUT -

$ command > /dev/null 2>&1

Đây 2 đại diện STDERR1 đại diện STDOUT. Bạn có thể hiển thị thông báo trên STDERR bằng cách chuyển hướng STDOUT thành STDERR như sau:

$ echo message 1>&2

Lệnh chuyển hướng

Sau đây là danh sách đầy đủ các lệnh mà bạn có thể sử dụng để chuyển hướng:

Sr.No. Lệnh & Mô tả
1

pgm > file

Đầu ra của pgm được chuyển hướng đến tệp

2

pgm < file

Chương trình pgm đọc đầu vào của nó từ tệp

3

pgm >> file

Đầu ra của pgm được nối vào tệp

4

n > file

Đầu ra từ luồng với bộ mô tả n chuyển hướng đến tệp

5

n >> file

Đầu ra từ luồng với bộ mô tả n thêm vào tệp

6

n >& m

Hợp nhất đầu ra từ luồng n với dòng m

7

n <& m

Hợp nhất đầu vào từ luồng n với dòng m

số 8

<< tag

Đầu vào tiêu chuẩn đến từ đây thông qua thẻ tiếp theo ở đầu dòng

9

|

Lấy đầu ra từ một chương trình hoặc quá trình và gửi nó đến một chương trình khác

Lưu ý rằng bộ mô tả tệp 0 thường là đầu vào tiêu chuẩn (STDIN), 1 là đầu ra tiêu chuẩn (STDOUT), và 2 là đầu ra lỗi tiêu chuẩn (STDERR).