Chương 3 Bash
3.5.1 sử dụng >, < và »
Đê’ chuyên hướng đầu vào/ra, sử dụng các ký hiệu "<" và Thường sử dụng việc chuyển hướng đữ liệu ra của câu lệnh vào tập tin. Dưới đây là một ví dụ tương ứng:
_______________________________ kênh giao tác _______________________________ maikhai@fpt:/some/where$ Is -1 > /home/maikhai/ls.txt
Theo lệnh này danh sách tập tin và thư mục con của thư mục, mà từ đó người dùng thực hiện lệnh l s 2 sẽ được ghi vào tập tin / h o m e / m a i k h a i / l s . t x t ; khi này nếu tập tin
32 Bash
I s . t x t không tồn tại, thì nó sẽ được tạo ra; nếu tập tin đã có, thì nội dung của nó sẽ bị xóa và ghi đè bởi danh sách nói trên. Nếu bạn không muốn xóa nội dung cũ mà ghi thêm dữ liệu đầu ra vào cuối tập tin, thì cần sử dụng ký hiệu >> thay cho >. Khi này khoảng trắng trước và sau các ký hiệu > hay » không có ý nghĩa và chỉ dùng với mục đĩch thuận tiện, dễ nhìn. Bạn có thể chuyển hướng không chỉ vào tập tin, mà còn tối đầu vào của một câu lệnh khác hay tới một thiết bị nào đó (ví dụ, máy in). Ví dụ, để đưa nội dung tập tin / h o m e / m a i k h a i / l s . t x t vừa tạo ở trên tới cửa sổ terminal thứ hai5 có thể sử dụng lệnh sau:
--- kênh giao t á c --- maikhai@fpt:/sw$ cat /home/maikhai/ls.txt > /dev/tty2
Như bạn thấy, > dùng để chuyển hướng dữ liệu cùa đầu ra. Chức năng tương tự đối với đầu vào được thực hiện bời <• Ví dụ, có thể đếm số từ trong tập tin l s . t x t như sau (chú ý, đây chỉ là một ví dụ minh họa, trên thực tế thường sử dụng câu lệnh đơn giản hơn):
___________________________________ kênh giao tác ___________________________________ maikhai@fpt:/sw$ wc -w < /home/maikhai/ls.txt
Cách chuyển hướng này thường được sử dụng trong các script, cho các câu lệnh mà thường tiếp nhận (hay chờ) dữ liệu vào từ bàn phím. Trong script dùng để tự động hóa một thao tác nào đó, có thể đưa các thông tin cần thiết cho câu lệnh từ tập tin: trong tập tin này ghi sẵn những gì cần để thực hiện lệnh đó. Bời vì các ký hiệu <, > và >> làm việc với các kênh tiêu chuẩn (đầu vào hoặc đầu ra), chúng không chỉ được dùng theo các cách quen thuộc, thường dùng, mà còn cố thể theo cách khác, "la mắt" hrtn. Ví đu, các câu lệnh sau là lifting đưrỉng:
--- kênh giao tác --- [user]$ cat > file
[user]$ cat>file [user] $ >file cat [user]$ > file cat
Tuy nhiên, tự chúng (không có một lệnh nào, tức là không có kênh tiêu chuẩn nào cho lệnh) các ký tự chuyển hướng này không thể được sử dụng, như thế không thể, ví dụ, nhập vào dòng lệnh sau:
r--- kênh giao tác --- [user]$ filel > file2
mà thu được bản sao của một tập tin nào đó. Nhưng điều này không làm giảm giá trị của cơ chế này, bời vì các kênh tiêu chuẩn có cho mọi câu lệnh. Khi này, có thể chuyển hướng không chỉ đầu vào và đầu ra tiêu chuẩn, mà còn các kênh khác. Đê’ làm được điều này, cần đặt trước ký hiệu chuyển hướng số của kênh muốn chuyên. Đầu vào tiêu chuẩn stdin có số 0, đầu ra tiêu chuẩn stdout - số 1, kênh thông báo lỗi stdeư - số 2. Tức là lệnh chuyển hướng có dạng đầy đủ như sau (xin được nhắc lại, khoảng trắng cạnh > là không nhất thiết):
command N > M
3.5 Chuyên hướng đầu vào/đầu ra, đường ống và đầu lọc 33
Trong đó, N và M - số của kênh tiêu chuẩn (0, 1, và 2) hoặc tên tập tin. Trong một vài trường hợp có sử dụng các ký hiệu <, > và >> mà không chỉ ra số kênh hay tên tập tin, vì vào chỗ còn thiếu sẽ đặt, theo mặc định, 1 nếu dùng >, tức là đầu ra tiêu chuẩn, hoặc 0 nếu dùng <, tức là đàu vào tiêu chuẩn. Như thế, khi không có số nào chỉ ra, > sẽ được biên dịch là 1 >, còn < sẽ được biên dịch là 0 <. Ngoài việc chuyển hướng các kênh tiêu chuẩn đơn giản như vậy, còn có khả năng không những chuyển hướng dữ liệu vào kênh này hay kênh khác, mà còn sao chép nội dung của các kênh tiêu chuẩn đó. Ký hiệu & dùng để thực hiện điều này, khi đặt nó (&) trước số của kênh sẽ chuyển dữ liệu đến:
command N > &M
Lệnh này có nghĩa là, đầu ra của kênh với số N được gửi đến cả đầu ra tiêu chuẩn, và sao chép tới kênh có số M. Ví dụ, để sao chép thông báo lỗi vào đầu ra tiêu chuẩn, cần dùng lệnh 2>&1, còn 1>&2 sao chép stdout vào stdeư. Khả năng này đặc biệt có ích khi muốn ghi đầu ra vào tập tin, vì khi đó chúng ta vừa có thể nhìn thấy thông báo trên màn hình, vừa ghi chúng vào tập tin. Ví dụ, trường hợp sau thường được ứng dụng trong các script chạy khi khởi đông Linux:
--- kênh giao tác --- teppi82@teppi: cat hiho > /dev/null
cat: hiho: No such file or directory teppi82@teppi:~$ cat hiho > /dev/null 2>&1