Tìm hiểu về đường ống và chuyển hướng cho dòng lệnh Linux
Hai tính năng mạnh mẽ của shell dòng lệnh Linux là chuyển hướng và đường ống cho phép đầu ra (hoặc thậm chí đầu vào) của một chương trình được gửi đến một tệp hoặc một chương trình khác. Bạn có thể đã sử dụng các tính năng này mà không cần biết về nó. Bất cứ khi nào bạn đã sử dụng dấu “ >
” trong một lệnh hoặc “ |
”Thì bạn đã sử dụng chuyển hướng hoặc một đường ống, tương ứng.
Trên tất cả các hệ điều hành giống Unix, như Linux và FreeBSD, đầu ra từ một chương trình dòng lệnh sẽ tự động chuyển đến một nơi được gọi là đầu ra tiêu chuẩn (stdout). Theo mặc định, tiêu chuẩn ra là màn hình (giao diện điều khiển) nhưng có thể được thay đổi bằng cách sử dụng đường ống và chuyển hướng. Tương tự như vậy bàn phím được coi là đầu vào tiêu chuẩn (stdin) và như với tiêu chuẩn ra, nó có thể được thay đổi.
Ống
Các đường ống cho phép bạn phễu đầu ra từ một lệnh vào một lệnh khác, nơi nó sẽ được sử dụng làm đầu vào. Nói cách khác, đầu ra tiêu chuẩn từ một chương trình trở thành đầu vào tiêu chuẩn cho một chương trình khác.
Lệnh " more
" lấy đầu vào tiêu chuẩn và phân trang nó trên đầu ra tiêu chuẩn (màn hình). Điều này có nghĩa là nếu một lệnh hiển thị nhiều thông tin hơn có thể được hiển thị trên một màn hình, chương trình " more
" sẽ tạm dừng sau màn hình đầu tiên đầy đủ (trang) và đợi người dùng nhấn SPACE để xem trang tiếp theo hoặc RETURN để xem hàng tiếp theo.
Đây là một ví dụ sẽ liệt kê tất cả các tập tin, với các chi tiết ( -la
) trong thư mục /dev
và đường dẫn đầu ra đến more
. Thư mục /dev
nên có hàng tá tệp và do đó đảm bảo rằng more
cần phải phân trang.
ls -la / dev | hơn
Lưu ý dấu nhắc --More--
ở cuối màn hình. Nhấn SPACE để xem trang tiếp theo và tiếp tục nhấn SPACE cho đến khi kết thúc đầu ra.
Dưới đây là một ví dụ về đường ống khác, lần này sử dụng công cụ " wc
" (số lượng từ).
ls -1 / dev | wc
wc
đếm số dòng, từ và ký tự trong đầu vào tiêu chuẩn. Nếu bạn sử dụng tham số -l
nó sẽ chỉ hiển thị số dòng, đó là cách tốt để xem có bao nhiêu tệp trong một thư mục!
Hướng dẫn sâu về hướng dẫn lưu trữ và nén lệnh của Linux có một ví dụ sử dụng tar
và 7-Zip với nhau:
tar cvf - * | 7zr a -si somefiles.tar.7z
Trong trường hợp này, dấu gạch ngang sau tùy chọn f
sẽ báo cho tar
gửi kết quả đầu ra của nó tới tiêu chuẩn và không gửi đến tệp. Các đầu ra từ tar
sẽ được đưa xuống đường ống vào 7zr đang chờ đầu vào từ tiêu chuẩn do tùy chọn -si.
Chuyển hướng
Chuyển hướng tương tự như đường ống ngoại trừ việc sử dụng tệp thay vì một chương trình khác. Đầu ra tiêu chuẩn cho một chương trình là màn hình. Sử dụng biểu tượng >
(lớn hơn) đầu ra của một chương trình có thể được gửi đến một tập tin. Đây là danh sách thư mục /dev
một lần nữa nhưng lần này chuyển hướng đến tệp có tên listing.txt
ls -la> listing.txt
Sẽ không có bất cứ điều gì được hiển thị trên thiết bị đầu cuối vì mọi thứ đã được gửi đến tệp. Bạn có thể xem tập tin bằng cách sử dụng lệnh cat
(có thể được chuyển thành more
) hoặc để thuận tiện, bạn chỉ có thể sử dụng more command
sau:
more listing.txt
Nếu listing.txt
đã tồn tại, nó sẽ bị ghi đè. Nhưng bạn có thể thêm vào một tập tin hiện có bằng cách sử dụng >>
như thế này:
ls -la / home> listing.txt ls -la / dev >> listing.txt
Chuyển hướng đầu tiên sẽ ghi đè lên tệp listing.txt
trong khi thứ hai sẽ thêm vào tệp đó.
Lệnh cat
có thể được sử dụng để tạo một tệp bằng cách sử dụng chuyển hướng, ví dụ:
cat> atextfile.txt
Bây giờ bất kỳ văn bản bạn gõ sẽ được gửi đến tập tin atextfile.txt
cho đến khi bạn nhấn Control-D, tại thời điểm đó tập tin sẽ được đóng lại và bạn sẽ được trả về dấu nhắc lệnh. Nếu bạn muốn thêm nhiều văn bản vào tệp, hãy sử dụng cùng một lệnh nhưng với hai dấu lớn hơn ( >>
).
Phần kết luận
Nhiều chương trình dòng lệnh Linux được thiết kế để làm việc với chuyển hướng và đường ống, hãy thử thử nghiệm chúng và xem chúng tương tác như thế nào. Ví dụ đầu ra của lệnh ps
, liệt kê các tiến trình hiện tại, có thể được chuyển thành grep
. Xem liệu bạn có thể tìm ra cách liệt kê các quy trình thuộc sở hữu của root hay không.