Đôi khi bạn muốn chuyển hướng cả thiết bị xuất chuẩn và thiết bị xuất chuẩn đến cùng một vị trí, Đây là khi >&
được sử dụng - nó trỏ một mô tả tệp sang một mô tả khác.
Ví dụ, nếu bạn muốn viết cả stdout và stderr đến cùng một tập tin (có thể là /dev/null
hay output.txt
), bạn có thể chuyển hướng một cách riêng biệt, với
app 1>/dev/null 2>/dev/null
hoặc bạn có thể chuyển hướng một bộ mô tả tệp sang tệp và bộ mô tả tệp khác vào tệp đầu tiên:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
Trong ví dụ đầu tiên, 2>&1
mô tả tập tin điểm # 2 đến nơi # 1 đã được trỏ. Ví dụ thứ hai đạt được điều tương tự, thay vào đó chỉ bắt đầu bằng stderr.
Một ví dụ khác, có những trường hợp khi thiết bị xuất chuẩn (mô tả tệp số 1) đã trỏ đến vị trí mong muốn, nhưng bạn không thể gọi nó theo tên (nó có thể được liên kết với một đường ống, ổ cắm hoặc như vậy). Điều này thường xảy ra khi sử dụng mở rộng quy trình ( ` `
hoặc $( )
toán tử), thông thường chỉ thu được thiết bị xuất chuẩn, nhưng bạn có thể muốn bao gồm thiết bị xuất chuẩn trong đó. Trong trường hợp này, bạn cũng sẽ sử dụng >&
để trỏ stderr vào thiết bị xuất chuẩn:
out=$(app 2>&1)
Một ví dụ phổ biến khác là máy nhắn tin, hoặc grep
, hoặc tiện ích tương tự, vì đường ống |
thường chỉ hoạt động trên thiết bị xuất chuẩn, bạn sẽ chuyển hướng thiết bị xuất chuẩn sang thiết bị xuất chuẩn trước khi sử dụng đường ống:
app 2>&1 | grep hello
Làm thế nào để biết được các 2>&1
hoặc 1>&2
là có đúng không? Bộ mô tả tệp đã được thiết lập ở bên phải >&
và bộ mô tả tệp bạn muốn chuyển hướng sang bên trái. ( 2>&1
có nghĩa là "mô tả tập tin điểm # 2 đến mô tả tập tin số 1".)
Một số shell có các phím tắt cho các chuyển hướng phổ biến; đây là những ví dụ từ Bash:
1>
có thể rút ngắn lại chỉ >
1>foo 2>&1
đến >&foo
hoặc&>foo
2>&1 | program
đến |& program
app 1>/dev/null 2>&1
vậy có nghĩa là 2> & 1 sẽ trỏ đến tệp mà 1 đã chuyển hướng đến. Tôi có thể dễ dàng làm điều đóapp > /dev/null &>
?