Thứ năm, 23/01/2014 | 00:00 GMT+7

Giới thiệu về Chuyển hướng I / O Linux

Khả năng chuyển hướng được tích hợp trong Linux cung cấp cho bạn một bộ công cụ mạnh mẽ được sử dụng để thực hiện tất cả các loại nhiệm vụ dễ dàng hơn. Cho dù bạn đang viết phần mềm phức tạp hay thực hiện quản lý file thông qua dòng lệnh, biết cách thao tác các stream I / O khác nhau trong môi trường của bạn sẽ giúp tăng năng suất của bạn lên rất nhiều.


Dòng


Đầu vào và kết quả trong môi trường Linux được phân phối trên ba stream . Các stream này là:

  • đầu vào tiêu chuẩn ( stdin )

  • kết quả tiêu chuẩn ( stdout )

  • lỗi tiêu chuẩn ( stderr )

Các stream cũng được đánh số:

  • stdin ( 0 )

  • stdout ( 1 )

  • stderr ( 2 )

Trong các tương tác tiêu chuẩn giữa user và terminal , đầu vào tiêu chuẩn được truyền qua bàn phím của user . Đầu ra tiêu chuẩn và lỗi tiêu chuẩn được hiển thị trên terminal của user dưới dạng văn bản. Nói chung, ba stream được gọi là các luồng tiêu chuẩn .

Đầu vào chuẩn


Luồng đầu vào tiêu chuẩn thường mang dữ liệu từ user đến một chương trình. Các chương trình mong đợi đầu vào tiêu chuẩn thường nhận đầu vào từ một thiết bị, chẳng hạn như bàn phím. Đầu vào tiêu chuẩn được kết thúc bằng cách đạt đến EOF (cuối file ). Như được mô tả bởi tên của nó, EOF cho biết không có thêm dữ liệu nào để đọc.

Để xem đầu vào tiêu chuẩn đang hoạt động, hãy chạy chương trình cat . Cat là viết tắt của concatenate, nghĩa là liên kết hoặc kết hợp một cái gì đó. Nó thường được sử dụng để kết hợp nội dung của hai file . Khi tự chạy, mèo sẽ mở một dấu nhắc lặp lại.

cat 

Sau khi mở con mèo, hãy nhập một chuỗi số khi nó đang chạy.

1 2 3 ctrl-d 

Khi bạn nhập một số và nhấn enter, bạn đang gửi đầu vào chuẩn cho chương trình mèo đang chạy, chương trình này đang mong đợi đầu vào đã nói. Đổi lại, chương trình mèo sẽ gửi đầu vào của bạn trở lại màn hình terminal dưới dạng kết quả tiêu chuẩn.

User có thể nhập EOF bằng cách nhấn ctrl-d. Sau khi chương trình mèo nhận được EOF, nó sẽ dừng lại.

Đầu ra tiêu chuẩn


Đầu ra chuẩn ghi dữ liệu được tạo bởi một chương trình. Khi stream kết quả tiêu chuẩn không được chuyển hướng, nó sẽ xuất văn bản tới terminal . Hãy thử ví dụ sau:

echo Sent to the terminal through standard output 

Khi được sử dụng mà không có bất kỳ tùy chọn bổ sung nào, lệnh echo sẽ hiển thị bất kỳ đối số nào được chuyển đến nó trên dòng lệnh. Một đối số là một cái gì đó được nhận bởi một chương trình.

Chạy echo mà không có bất kỳ đối số nào:

echo 

Nó sẽ trả về một dòng trống, vì không có đối số.

Lỗi chuẩn


Lỗi chuẩn ghi các lỗi được tạo ra bởi một chương trình bị lỗi tại một thời điểm nào đó trong quá trình thực thi. Giống như kết quả tiêu chuẩn, đích mặc định cho stream này là màn hình terminal .

Khi stream lỗi tiêu chuẩn của một chương trình được chuyển đến chương trình thứ hai, dữ liệu được tổng hợp (bao gồm các lỗi chương trình) cũng được gửi đồng thời đến terminal .

Hãy xem một ví dụ cơ bản về lỗi chuẩn bằng lệnh ls. ls liệt kê nội dung của một folder .

Khi chạy mà không có đối số, ls liệt kê nội dung trong folder hiện tại. Nếu ls được chạy với một folder làm đối số, nó sẽ liệt kê nội dung của folder được cung cấp.

ls %  

Vì% không phải là một folder hiện có, điều này sẽ gửi văn bản sau đến lỗi chuẩn:

ls: cannot access %: No such file or directory 

Chuyển hướng stream


Linux bao gồm các lệnh chuyển hướng cho mỗi stream . Các lệnh này ghi kết quả tiêu chuẩn vào một file . Nếu một file không tồn tại được nhắm đến (bằng lệnh ngoặc đơn hoặc ngoặc kép), một file mới có tên đó sẽ được tạo trước khi ghi.

Các lệnh có một dấu ngoặc đơn sẽ ghi đè lên nội dung hiện có của đích.

Ghi đè

  • > - kết quả tiêu chuẩn

  • < - đầu vào chuẩn

  • 2> - lỗi tiêu chuẩn

Các lệnh có dấu ngoặc kép không overrides lên nội dung hiện có của đích.

Nối

  • >> - kết quả tiêu chuẩn

  • << - đầu vào chuẩn

  • 2 >> - lỗi tiêu chuẩn

Hãy xem một ví dụ:

cat > write_to_me.txt a b c ctrl-d 

Ở đây, cat đang được sử dụng để ghi vào một file , file này được tạo ra do kết quả của vòng lặp.

Xem nội dung của write to me.txt bằng cat:

cat write_to_me.txt 

Nó phải có các nội dung sau:

a b c 

Chuyển hướng con mèo viết lại me.txt và nhập ba số.

cat > write_to_me.txt 1 2 3 ctrl-d 

Khi bạn sử dụng cat để xem ghi vào me.txt, bạn sẽ thấy như sau:

1 2 3 

Nội dung trước đó không còn ở đó nữa vì file đã bị overrides bởi lệnh dấu ngoặc đơn.

Thực hiện thêm một chuyển hướng mèo nữa, lần này sử dụng dấu ngoặc kép:

cat >> write_to_me.txt a b c ctrl-d 

Mở lại ghi vào me.txt và bạn sẽ thấy:

1 2 3 a b c 

Tệp hiện chứa văn bản từ cả hai lần sử dụng cat, vì cái thứ hai không overrides cái đầu tiên.

Đường ống


Pipes được sử dụng để chuyển hướng một stream từ chương trình này sang chương trình khác. Khi kết quả chuẩn của một chương trình được gửi đến một chương trình khác thông qua một đường ống, dữ liệu của chương trình đầu tiên, được chương trình thứ hai nhận, sẽ không được hiển thị trên terminal . Chỉ dữ liệu đã lọc do chương trình thứ hai trả về mới được hiển thị.

Đường ống Linux được biểu thị bằng một thanh dọc.

*|* 

Ví dụ về lệnh sử dụng đường ống:

ls | less 

Này có kết quả của ls, hiển thị các nội dung của folder hiện tại của bạn, và ống dẫn nó vào chương trình ít hơn. ít hiển thị dữ liệu được gửi đến nó từng dòng một.

ls thường hiển thị nội dung folder trên nhiều hàng. Khi bạn chạy nó qua ít hơn, mỗi mục nhập được đặt trên một dòng mới.

Mặc dù chức năng của đường ống có thể tương tự như chức năng của >>> (chuyển hướng kết quả tiêu chuẩn), sự khác biệt là đường ống chuyển hướng dữ liệu từ lệnh này sang lệnh khác, trong khi >>> được sử dụng để chuyển hướng riêng đến file .

Bộ lọc


Bộ lọc là các lệnh thay đổi chuyển hướng đường ống và kết quả . Lưu ý các lệnh bộ lọc cũng là các lệnh Linux tiêu chuẩn được dùng mà không cần đường ống.

  • find - Tìm trả về các file có tên file phù hợp với đối số được truyền để tìm.

  • grep - Grep trả về văn bản trùng với mẫu chuỗi được chuyển tới grep.

  • tee - Tee chuyển hướng đầu vào tiêu chuẩn sang cả kết quả tiêu chuẩn và một hoặc nhiều file .

  • tr - tr tìm và thay thế một chuỗi này bằng chuỗi khác.

  • wc - wc đếm các ký tự, dòng và từ.

Ví dụ


Đến đây bạn đã được giới thiệu về chuyển hướng, đường ống và bộ lọc cơ bản, ta hãy xem xét một số mẫu và ví dụ chuyển hướng cơ bản.

lệnh> file

Mẫu này chuyển hướng kết quả tiêu chuẩn của một lệnh đến một file .

ls ~ > root_dir_contents.txt 

Lệnh trên chuyển nội dung của folder root hệ thống của bạn làm kết quả tiêu chuẩn và ghi kết quả vào file có tên root dir content.txt . Nó sẽ xóa mọi nội dung trước đó trong file , vì nó là một lệnh trong dấu ngoặc đơn.

lệnh> / dev / null

/ dev / null là một file đặc biệt được sử dụng để dọn rác bất kỳ dữ liệu nào được chuyển hướng đến nó. Nó được sử dụng để loại bỏ kết quả tiêu chuẩn không cần thiết và có thể ảnh hưởng đến chức năng của lệnh hoặc tập lệnh. Bất kỳ kết quả nào được gửi đến / dev / null đều bị loại bỏ.
Trong tương lai, bạn có thể thấy thực hành chuyển hướng kết quả tiêu chuẩn và lỗi tiêu chuẩn thành / dev / null khi viết các tập lệnh shell.

ls > /dev/null 

Lệnh này loại bỏ stream kết quả tiêu chuẩn được trả về từ lệnh ls bằng cách chuyển nó tới / dev / null.

lệnh 2> file

Mẫu này chuyển hướng dòng lỗi tiêu chuẩn của một lệnh đến một file , overrides lên nội dung hiện có.

mkdir '' 2> mkdir_log.txt 

Điều này chuyển hướng lỗi do tên folder không hợp lệ “gây ra và ghi nó vào log.txt. Lưu ý lỗi vẫn được gửi đến terminal và hiển thị dưới dạng văn bản.

lệnh >> file

Mẫu này chuyển hướng kết quả tiêu chuẩn của một lệnh đến một file mà không overrides lên nội dung hiện có của file .

echo Written to a new file > data.txt echo Appended content to an existing file >> data.txt 

Cặp lệnh này đầu tiên chuyển hướng văn bản được user nhập thông qua echo đến một file mới. Sau đó, nó nối văn bản nhận được bằng lệnh echo thứ hai vào file hiện có mà không overrides nội dung của nó.

lệnh 2 >> file

Mẫu trên chuyển hướng dòng lỗi tiêu chuẩn của lệnh đến file mà không overrides lên nội dung hiện có của file . Mẫu này hữu ích để tạo log lỗi cho một chương trình hoặc dịch vụ, vì file log sẽ không bị xóa sạch nội dung trước đó mỗi khi file được ghi vào.

find '' 2> stderr_log.txt wc '' 2>> stderr_log.txt 

Lệnh trên chuyển hướng thông báo lỗi do đối số tìm không hợp lệ gây ra đến file có tên stderr_log.txt. Sau đó, nó nối thông báo lỗi do đối số wc không hợp lệ gây ra vào cùng một file .

lệnh | chỉ huy

Chuyển hướng kết quả tiêu chuẩn từ lệnh đầu tiên sang đầu vào tiêu chuẩn của lệnh thứ hai.

find /var lib | grep deb 

Lệnh này tìm kiếm qua / var và các folder con của nó để tìm tên file và phần mở rộng trùng với chuỗi deb và trả về đường dẫn file cho file , với phần phù hợp trong mỗi đường dẫn được đánh dấu màu đỏ.

lệnh | file tee

Mẫu này (bao gồm lệnh tee ) chuyển hướng kết quả tiêu chuẩn của lệnh thành một file và overrides nội dung của nó. Sau đó, nó hiển thị kết quả được chuyển hướng trong terminal . Nó tạo một file mới nếu file chưa tồn tại.

Trong bối cảnh của mẫu này, tee thường được sử dụng để xem kết quả của chương trình đồng thời lưu nó vào một file .

wc /etc/magic | tee magic_count.txt 

Điều này chuyển số lượng ký tự, dòng và từ trong file ma thuật (được sử dụng bởi Linux shell để xác định loại file ) đến lệnh tee, sau đó chia kết quả của wc theo hai hướng và gửi nó đến màn hình terminal và magic_count file .txt. Đối với lệnh tee, hãy tưởng tượng chữ T. Phần dưới cùng của chữ cái là dữ liệu ban đầu và phần trên cùng là dữ liệu được chia theo hai hướng khác nhau ( kết quả chuẩn và terminal ).

Nhiều đường ống được dùng để chuyển hướng kết quả qua nhiều lệnh và / hoặc bộ lọc.

lệnh | lệnh | lệnh >> file

Mẫu này dự đoán kết quả tiêu chuẩn của lệnh đầu tiên và lọc nó qua hai lệnh tiếp theo. Sau đó, nó mount quả cuối cùng vào một file .

ls ~ | grep *tar | tr e E >> ls_log.txt 

Điều này bắt đầu bằng cách chạy ls trong folder root của bạn (~) và chuyển kết quả đến lệnh grep. Trong trường hợp này, grep trả về danh sách các file chứa tar trong tên file hoặc phần mở rộng của chúng.

Kết quả từ grep sau đó được chuyển đến tr, thay thế các lần xuất hiện của ký tự e bằng E , vì e đang được chuyển làm đối số đầu tiên (chuỗi cần tìm kiếm) và E được chuyển làm đối số thứ hai (chuỗi thay thế bất kỳ khớp nào với đối số đầu tiên). Kết quả cuối cùng này sau đó được thêm vào file ls_log.txt, file này được tạo nếu nó chưa tồn tại).

Kết luận


Học cách sử dụng các khả năng chuyển hướng được tích hợp trong dòng lệnh Linux có thể hơi khó khăn, nhưng bạn đang trên đường thành thạo bộ kỹ năng này sau khi hoàn thành hướng dẫn này. Đến đây bạn đã thấy những điều cơ bản về cách hoạt động của chuyển hướng và đường ống, bạn có thể bắt đầu bước vào thế giới của kịch bản shell, sử dụng thường xuyên các chương trình và mẫu được đánh dấu trong hướng dẫn này.

Nếu bạn muốn tìm hiểu sâu hơn về các lệnh được giới thiệu trong hướng dẫn này, bạn có thể làm như vậy với lệnh man | ít hơn . Ví dụ:

man tee | less 

Điều này sẽ hiển thị cho bạn danh sách đầy đủ các lệnh có sẵn cho chương trình phát bóng. Bạn có thể sử dụng mẫu này để hiển thị thông tin và các tùy chọn sử dụng cho bất kỳ lệnh hoặc chương trình Linux nào.

Googling cho các lệnh cụ thể hoặc cho một cái gì đó mà bạn muốn thực hiện trong dòng lệnh (ví dụ: "xóa tất cả các file trong folder bắt đầu bằng chữ hoa") cũng có thể hữu ích khi bạn cần hoàn thành một tác vụ cụ thể bằng lệnh hàng.

<div class = “author”> Bởi David Collazo </div>


Tags:

Các tin liên quan

Giới thiệu về Chuyển hướng I / O Linux
2014-01-23
Cách thiết lập server email Postfix với Dovecot: Dynamic Maildirs và LMTP
2013-12-17
Cách xem và cấu hình log Linux trên Ubuntu và Centos
2013-12-17
Cách cài đặt Linux Socket Monitor (LSM) trên CentOS 6.4
2013-11-26
Cách sử dụng ApacheBench để thực hiện kiểm tra tải trên VPS Arch Linux
2013-11-21
Cách thiết lập server VPN đa giao thức bằng SoftEther
2013-11-19
Cách thiết lập server e-mail Postfix với Dovecot
2013-11-14
Cách thiết lập WordPress với W3 Total Cache trên Lighttpd Server
2013-11-12
Thiết lập server ban đầu với Debian 7
2013-11-04
Cách cài đặt Linux, Nginx, MySQL, PHP (LEMP) trên Debian 7
2013-10-31