Tên của tính năng shell `> (tee copyError.txt> & 2)` là gì?


11

Tôi cần đăng nhập stdout và stderr vào logfiles, nhưng chỉ hiển thị các thông báo lỗi trên màn hình. Tôi có thể làm điều này với:

cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2) 

Mà tôi tìm thấy ở đâu đó trên web.

Tôi chỉ muốn biết làm thế nào điều này >(tee copyError.txt >&2)được gọi là? Tôi không thể google cho nó, vì Google bỏ qua các ký tự như dấu ngoặc nhọn và dấu ngoặc đơn ..



@terdon Tôi nghĩ OP đã tuyên bố rằng anh ấy muốn đăng nhập StdOut và StdErr vào các tệp, nhưng vẫn hiển thị StdErr trên màn hình
Dmitry Avtonomov

Câu trả lời:


11

Từ man bash:

   Process Substitution
       Process substitution is supported  on  systems  that  support
       named  pipes  (FIFOs)  or  the  /dev/fd method of naming open
       files.  It takes the form of <(list) or >(list).  The process
       list  is  run with its input or output connected to a FIFO or
       some file in /dev/fd.  The name of this file is passed as  an
       argument  to  the current command as the result of the expan
       sion.  If the >(list) form is used, writing to the file  will
       provide  input  for  list.   If the <(list) form is used, the
       file passed as an argument should be read to obtain the  out
       put of list.

Bạn có thể tìm kiếm các trang bằng cách nhấn /và sau đó nhập chuỗi tìm kiếm của bạn, đây là một cách tốt để tìm thông tin như thế này. Tất nhiên nó yêu cầu bạn phải biết trong trang tìm kiếm nào :)

Bạn phải trích dẫn (mặc dù, bởi vì nó có một ý nghĩa đặc biệt khi tìm kiếm. Để tìm phần có liên quan trong trang bash, gõ />\(.


Tôi làm bash rất nhiều, vì vậy tôi đã làm một người đàn ông bash> bashman.txt và làm cho nó chỉ đọc. Bây giờ, tôi có thể tải bashman.txt vào một cửa sổ khác trong trình soạn thảo văn bản của mình (chỉ đọc) và sử dụng tất cả các phương tiện của trình soạn thảo để tìm kiếm, sao chép và dán.
Joe

8

>(tee copyError.txt >&2) thực sự là một vài tính năng khác nhau:

  • >(...)được gọi là "quá trình thay thế". Nó tạo ra một tệp ống có tên trong /dev/fdvà ghi vào tệp đó sẽ cung cấp đầu vào cho quá trình trong ngoặc đơn.

  • >: Nói chung, điều này được gọi là 'chuyển hướng đầu ra' và cho phép bạn gửi đầu ra tiêu chuẩn ( >hoặc 1>) hoặc lỗi tiêu chuẩn ( 2>) đến một tệp hoặc quy trình. >&2là đầu ra chuyển hướng nhưng trong trường hợp này, sản lượng teesẽ được gửi đến sai số chuẩn (nghĩa là những gì &2là, &1là đầu ra tiêu chuẩn)

  • Không có >, dấu ngoặc đơn ( ()) sẽ bắt đầu một chuỗi con. Các lệnh đang chạy trong ngoặc đơn sẽ sinh ra một shell khác chỉ tồn tại trong chừng nào các lệnh đó đang chạy. Bạn có thể thấy nó hoạt động như thế nào nếu bạn khai báo một biến trong lớp con:

    $ foo='Tom';(foo='Dick'; echo "Sub: $foo"); echo "Orig: $foo"
    Sub: Dick
    Orig: Tom

    Như bạn có thể thấy, $foocái được định nghĩa trong lớp con tách biệt với cái được định nghĩa trong vỏ cha.


4
Không >(...)không phải là một chuyển hướng. >(...)được mở rộng thành một tên tập tin. Nếu bạn muốn chuyển hướng đầu ra đến đó, bạn cần > >(...)nhưng >(...)thường được sử dụng nhiều hơn khi không thể sử dụng chuyển hướng. Lệnh của OP có thể đạt được bằng các đường ống truyền thống, không cần thay thế quy trình ở đó.
Stéphane Chazelas

@StephaneChazelas Rất vui khi thấy giải pháp bạn có trong đầu
Dmitry Avtonomov

3
@chhh,cmd 2>&1 > output | tee err >&2
Stéphane Chazelas

@StephaneChazelas thx!
Dmitry Avtonomov

Nửa đầu của câu trả lời này là sai, hoặc ít nhất là rất sai lệch; đúng là >có thể biểu thị chuyển hướng đầu ra và ()có thể biểu thị một nhánh con, nhưng >(...)thực sự là một tính năng đơn nhất, đơn nhất không bao gồm >().
ruakh
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.