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 tiêu 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 đó, đầ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 thành 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 tiêu chuẩn, đầu ra của lệnh đó sẽ được ghi vào tệp thay vì thiết bị đầu cuối của bạn.
Kiểm tra lệnh whoi sau đây chuyển hướng đầu ra hoàn chỉnh của lệnh trong tệp người dùng.
$ who > users
Lưu ý rằng không có đầu ra nào xuất hiện ở thiết bị đầ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, thì 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. Vì ký tự lớn hơn> được sử dụng để chuyển hướng đầu ra, ký tự nhỏ hơn < đượ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 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
$
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ủa lệnh wc 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 chuẩn nên nó không hiển thị tên tệp.
Đây là tài liệu
Một tài liệu ở đây được sử dụng để chuyển hướng đầu vào vào 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 tài liệu ở đây 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 đó đượ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 tài liệu ở đây đã hoàn thành. Nếu không có nó, trình bao 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ể sử dụng tài liệu tại đây để in nhiều dòng bằng tập lệnh của mình 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 trình soạn thảo văn bản vi 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 hoạt động như 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 / dev / null là một tệp đặ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 cho STDERR và 1 đại diện cho 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> tệp Đầu ra của pgm được chuyển hướng đến tệp |
2 | pgm <tập tin Chương trình pgm đọc đầu vào của nó từ tệp |
3 | pgm >> tệp Đầu ra của pgm được nối vào tệp |
4 | n> tệp Đầu ra từ luồng với bộ mô tả n được chuyển hướng đến tệp |
5 | n >> tệp Đầu ra từ luồng với bộ mô tả n được nối vào tệp |
6 | n> & m Hợp nhất đầu ra từ luồng n với luồng m |
7 | n <& m Hợp nhất đầu vào từ luồng n với luồng m |
số 8 | thẻ << Đầ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).