Những gì mà 3 3 & & 1 1> & 2 2> & 3 phải làm gì trong một kịch bản?


69

Tôi thấy dòng này trong một kịch bản:

DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das 
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`

Những gì là

3>&1 1>&2 2>&3

đang làm? Tôi biết rằng 1 = stdout và 2 = stderr, nhưng cái gì 3và cái &gì?


Câu trả lời:


77

Các số này là mô tả tệp và chỉ ba số đầu tiên (bắt đầu bằng 0) có nghĩa chuẩn:

0 - stdin
1 - stdout
2 - stderr

Vì vậy, mỗi số trong lệnh của bạn đề cập đến một bộ mô tả tệp. Bạn có thể chuyển hướng một bộ mô tả tệp đến một tệp với >hoặc chuyển hướng nó đến một bộ mô tả tệp khác với>&

Các 3>&1trong dòng lệnh của bạn sẽ tạo ra một mô tả tập tin mới và chuyển hướng nó vào 1đó là STDOUT. Bây giờ 1>&2sẽ chuyển hướng bộ mô tả tập tin 1 đến STDERR2>&3sẽ chuyển hướng bộ mô tả tập tin 2 đến 3 STDOUT.

Vì vậy, về cơ bản bạn đã chuyển đổi STDOUTSTDERR, đây là các bước:

  1. Tạo một fd 3 mới và trỏ nó vào fd 1
  2. Chuyển hướng mô tả tệp 1 sang mô tả tệp 2. Nếu chúng tôi không lưu mô tả tệp trong 3, chúng tôi sẽ mất mục tiêu.
  3. Chuyển hướng mô tả tệp 2 sang mô tả tệp 3. Bây giờ mô tả tệp một và hai được chuyển đổi.

Bây giờ nếu chương trình in một cái gì đó cho bộ mô tả tập tin 1, nó sẽ được in ra bộ mô tả tập tin 2 và ngược lại.


Bạn đã nói "3> & 1 trong dòng lệnh của bạn sẽ tạo một bộ mô tả tệp mới và chuyển hướng nó đến 1 là STDOUT". Nhưng không 1 có nghĩa là STDIN?
sofs1

19

Đó là trao đổi stdoutstderr.

>namecó nghĩa là chuyển hướng đầu ra đến tập tin name.

>&numbercó nghĩa là chuyển hướng đầu ra đến mô tả tập tin number.

Vì vậy, &cần thiết để nói với shell bạn có nghĩa là một mô tả tệp, không phải là một tên tệp.

Một mô tả tập tin là một số đề cập đến một tập tin đã mở. Các tiêu chuẩn là 0cho đầu vào tiêu chuẩn, 1cho đầu ra tiêu chuẩn hoặc 2cho lỗi tiêu chuẩn. Bạn cũng có thể sử dụng bất kỳ số nào khác, sẽ tạo một bộ mô tả tệp mới, giống như khi bạn tạo một biến mới với var=value.

Theo mặc định, cả bộ mô tả tệp 12đi đến /dev/tty, vì vậy nếu bạn chạy somecommand 3>&1 1>&2 2>&3trong trình bao mới, nó không thay đổi bất cứ điều gì (ngoại trừ bây giờ bạn có bộ mô tả tệp số 3).

Nhưng nếu ở đâu đó sớm hơn trong tập lệnh, nó thực hiện chuyển hướng bằng cách sử dụng exec (ví dụ exec 2>error.log) hoặc tập lệnh được chạy với một dòng lệnh bao gồm chuyển hướng (ví dụ ./thescript 2>error.log), sau đó trao đổi stdout và stderr sẽ làm gì đó.

Trong trường hợp cụ thể của bạn, lệnh đó có thiết bị xuất chuẩn và thiết bị lỗi chuẩn được hoán đổi là dialog. Nhìn vào trang người đàn ông của nó , tôi thấy

Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error

Vì vậy, có lẽ người đã viết kịch bản muốn dialogđầu ra stdoutthay vì stderrmột số lý do.

Xem thêm Thứ tự chuyển hướng


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.