106
Bash
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, “lạ mắt” hơn. Ví dụ, các câu lệnh sau là tương đương:
[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:
[user]$ file1 > 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 stderr - 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
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 stderr. 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:
teppi82@teppi:~$ cat hiho > /dev/null
cat: hiho: No such file or directory
teppi82@teppi:~$ cat hiho > /dev/null 2>&1