Mục đích của 'tee' là gì?


90

Tất cả các công dụng của teetôi từng thấy là như vậy:

 do_something | tee -a logfile

Hoặc là:

do_something_else | tee logfile

Được teephát minh cho những người không biết bạn có thể làm tương tự với chuyển hướng ống vỏ? Nhu la:

do_something >> logfile

Hoặc là:

do_something_else > logfile

Nó thực tế giống nhau và cần ít lần nhấn bàn phím hơn để gõ. Tôi không thấy những tính năng ẩn teenào?


62
Làm thế nào điều này không được trả lời bởi dòng đầu tiên của trang man "... và ghi vào đầu ra và tệp tiêu chuẩn" ? Các câu trả lời rất thú vị, nhưng nói rộng ra về cách các đường ống hữu ích chỉ củng cố làm thế nào Q này có vẻ quá rộng, và có lẽ nên được đóng lại.
Xen2050

3
@ Xen2050 Một câu hỏi không thể đổ lỗi cho câu trả lời quá rộng. Câu hỏi rất cụ thể, như là câu trả lời được đánh giá cao nhất hiện nay .
Jon Bentley

1
@JonBentley câu hỏi không giống như "một vấn đề cụ thể có đủ chi tiết để xác định câu trả lời đầy đủ" (khi hộp thoại đóng đọc). Nghe có vẻ như thế này: "nếu toàn bộ câu hỏi của bạn có thể được trả lời hoặc có nhiều câu trả lời hợp lệ (nhưng không có cách nào để xác định câu nào - nếu có - là chính xác), thì có lẽ nó quá rộng đối với định dạng của chúng tôi." (Nguồn: Trung tâm trợ giúp )
Xen2050

4
@ Xen2050 Có phải chúng ta đang đọc cùng một câu hỏi? Nó có vẻ rất cụ thể đối với tôi - sự khác biệt giữa tee và ống là gì? Nó đã được trả lời đầy đủ bằng cách sử dụng hai câu. Xa từ toàn bộ một cuốn sách. Thực tế là một số câu trả lời chọn đi tiếp tuyến không liên quan gì đến phạm vi của câu hỏi.
Jon Bentley

@JonBentley: Chúng ta có đang đọc cùng một câu hỏi không? R Moog loại-of-loại của ngụ ý một câu hỏi khá tốt tập trung - sự khác biệt giữa là những gì tee I / O chuyển hướng ?   Thực tế là nó nói rằng các chuyển hướng đường ống vỏ sò như và không phải là một điểm có lợi cho nó, và là một đối số cho việc đóng cửa là không rõ ràng. Nhưng nó thực sự đặt ra nhiều câu hỏi: Mục đích của ? Mục đích gì, được phát minh cho những người không biết bạn có thể làm điều tương tự với các chuyển hướng ống vỏ? Nghiêm và các tính năng ẩn mà tôi không thấy trong ? Ít nhất hai trong số những câu hỏi đó là quá rộng. >>>teeteetee
G-Man

Câu trả lời:


242

Những gì bạn không thấy là do_something | tee -a logfileđặt các đầu ra vào logfile để stdout, trong khi do_something >> logfileđặt nó chỉ vào logfile.

Mục đích của teeviệc tạo ra một kịch bản một đầu vào, nhiều đầu ra - giống như trong giao diện 'T'.

BIÊN TẬP

Đã có ý kiến ​​xung quanh làm thế nào teecho phép sử dụng dường như nhiều hơn sudo. Điều này nằm bên cạnh điểm : cat, ddhoặc có thể buffercung cấp khả năng này tốt hơn với hiệu suất tốt hơn, nếu bạn không cần nhiều đầu ra. Sử dụng teecho những gì nó được thiết kế, không phải cho những gì nó "cũng có thể làm"


37
Nhiều đầu ra là chìa khóa. teethậm chí có thể lấy nhiều đối số và ghi vào nhiều tệp cùng một lúc.
Kamil Maciorowski

20
Tôi sẽ gọi nó là một ống nối tee , không phải là một ngã tư (như trong một ngã tư đường?) Công cụ đi theo một cách và đi ra cả hai cách.
user20574

7
Làm thế nào tôi có thể sử dụng catmột cách đơn giản thay vì teetrong ví dụ echo /var/work/core.%p | sudo tee /proc/sys/kernel/core_pattern? echo /var/work/core.%p | sudo cat > /proc/sys/kernel/core_patternkhông hoạt động, bởi vì chuyển hướng được xử lý bởi trình bao không sudo. Đối với dd, echo /var/work/core.%p | sudo dd of=/proc/sys/kernel/core_patternhoạt động, nhưng ddthường là một công cụ áp đảo có khả năng gây sát thương lớn, đặc biệt là dưới sudo. Về phần buffer, nó không được cài đặt theo mặc định trong bất kỳ bản phân phối dựa trên RedHat hoặc Ubuntu nào mà tôi phải xử lý (hoặc MacOS) ...
Chấn thương kỹ thuật số

3
@EugenRieck Tôi hiểu ý của bạn về mối quan hệ 1: n giữa in: out là hàm chính. Tuy nhiên, cả nội dung catcũng không /bin/cathoạt động cho tôi trong tình huống này. Nó không quan trọng catđến từ đâu - ý >chí vẫn được xử lý bởi lớp vỏ cấp cao nhất (không phải sudo). Ưu điểm của teehơn cattrong tình huống này là nó cho phép các tập tin đầu ra được thông qua như một param dòng lệnh (và không phải là một chuyển hướng). ddchắc chắn là một lựa chọn khả thi, mặc dù tôi vẫn ủng hộ teeđiều này
Chấn thương kỹ thuật số

3
@EugenRieck Vỏ nào có catteedưới dạng tích hợp? Và phiên bản nào sudocó thể chạy được nội dung shell?
wjandrea

118

Tee không vô dụng

Có lẽ bạn biết điều đó không? Nếu không, hãy đọc tiếp! Hoặc nếu bạn biết nó hoạt động như thế nào, nhưng không chắc tại sao nó tồn tại, hãy bỏ qua đến cuối để xem nó phù hợp với triết lý Unix như thế nào.

Có gì mục đích tee?

Đơn giản nhất, nó lấy dữ liệu về đầu vào tiêu chuẩn và ghi nó vào đầu ra tiêu chuẩn và một (hoặc nhiều) tệp. Nó đã được ví như một mảnh tee ống nước theo cách nó chia một đầu vào thành hai đầu ra (và hai hướng).

Ví dụ

Hãy lấy ví dụ đầu tiên của bạn:

do_something | tee -a logfile

Điều này nhận đầu ra do_somethingvà nối nó vào logfile, đồng thời hiển thị nó cho người dùng. Trên thực tế, trang Wikipedia trêntee có ví dụ thứ hai:

Để xem và nối đầu ra từ một lệnh vào một tệp hiện có:

  lint program.c | tee -a program.lint

Điều này sẽ hiển thị đầu ra tiêu chuẩn của lệnh lint program.c tại máy tính và đồng thời nối thêm một bản sao của nó vào cuối tệp chương trình.lint. Nếu tệp chương trình.lint không tồn tại, nó được tạo.

Ví dụ tiếp theo có một cách sử dụng khác: leo thang quyền :

Để cho phép leo thang quyền:

cat ~/.ssh/id_rsa.pub | ssh admin@server "sudo tee -a /root/.ssh/authorized_keys2 > /dev/null"

Ví dụ này cho thấy tee được sử dụng để vượt qua giới hạn vốn có trong sudolệnh. sudokhông thể dẫn đầu ra tiêu chuẩn vào một tập tin. Bằng cách bỏ luồng tiêu chuẩn ra /dev/null, chúng tôi cũng triệt tiêu đầu ra được nhân đôi trong bảng điều khiển. Lệnh trên cho phép người dùng hiện tại truy cập vào máy chủ qua ssh, bằng cách cài đặt khóa chung của người dùng vào danh sách ủy quyền khóa của máy chủ.

Hoặc có lẽ bạn muốn lấy đầu ra của một lệnh, viết nó ở đâu đó và cũng sử dụng nó làm đầu vào cho một lệnh khác?

Bạn cũng có thể sử dụng lệnh tee để lưu trữ đầu ra của lệnh vào một tệp và chuyển hướng đầu ra tương tự như đầu vào sang một lệnh khác.

Lệnh sau đây sẽ sao lưu các mục crontab và chuyển các mục crontab làm đầu vào cho lệnh sed sẽ thực hiện thay thế. Sau khi thay thế, nó sẽ được thêm vào như một công việc định kỳ mới.

$ crontab -l | tee crontab-backup.txt | sed 's/old/new/' | crontab –

(tín dụng cho các ví dụ sử dụng lệnh Tee )

Tee hoạt động với triết lý Unix:

Viết chương trình làm một việc và làm tốt. Viết chương trình để làm việc cùng nhau. Viết chương trình để xử lý các luồng văn bản, bởi vì đó là một giao diện phổ quát.

(Tín dụng cho những điều cơ bản của triết lý Unix )

tee phù hợp với tất cả những điều này:

  • nó làm một việc: tạo thêm một bản sao đầu vào
  • nó hoạt động với các chương trình khác bởi vì nó là chất keo (hoặc một ống nước 'T' nếu bạn thích) cho phép các chương trình khác hoạt động cùng nhau như trong các ví dụ trên
  • nó thực hiện điều này bằng cách thao tác một luồng văn bản được cung cấp trên đầu vào tiêu chuẩn

3
@Joe: sudo tee -acó lẽ là một sự đổi mới gần đây (lần đầu tiên tôi thấy nó trong hướng dẫn / wiki của Ubuntu đặc biệt là để cài đặt công cụ /proc/sys, bởi vì chuyển sang Ubuntu là khi tôi chuyển sang một sudohệ thống dựa trên (cách Ubuntu được cấu hình theo mặc định) thay vì sử dụng suvới mật khẩu gốc). Tôi nghĩ rằng teecó trước sudo, vì vậy nó không phải là một lý do cho teehiện tại. Bạn không cần teeđiều đó, chỉ đơn giản là ngắn hơn để gõ tương tác hơn sudo sh -c 'cat > output'.
Peter Cordes

1
Với các vỏ hiện đại như bash, bạn có thể teenuôi hai đường ống, như thế nào foo | tee >(pipe2) | pipe1. Hoặc một điều thú vị khác là ffmpeg ... |& tee /dev/tty | sed 's/.*\r// > encode.logxem các cập nhật dòng trạng thái tương tác trên tty, trong khi loại bỏ các "dòng" kết thúc bằng trả lại vận chuyển thay vì dòng mới để ghi nhật ký thực tế. (tức là lọc ra các cập nhật dòng trạng thái). Nói chung, bạn có thể dán tee /dev/ttybất cứ nơi nào trong đường ống dưới dạng gỡ lỗi.
Peter Cordes

2
Đó không phải là một giới hạn của sudo mà bạn đang làm việc xung quanh và hơn nữa là giới hạn của cách giải thích của shell. Khi bạn chạy một lệnh với sudo, thiết bị xuất chuẩn của nó sẽ được gửi trở lại chương trình shell của bạn và các chuyển hướng tiếp theo với> được chạy với quyền của shell. Nếu bạn muốn viết với quyền nâng cao, bạn cần phải có phần nâng cao của đường ống là những gì viết. Có một số lượng lớn các cách để làm điều này tùy thuộc vào chính xác hiệu ứng bạn sẽ làm. Nếu bạn thực sự muốn sử dụng> một cái gì đó như 'sudo bash -c "lệnh> outfile"' sẽ thực hiện công việc.
Perkins

Chính xác, @Perkins. Shell phân tích cú pháp >và thiết lập chuyển hướng trước khi sudo thậm chí nhận được exec, vì vậy nó chắc chắn không phải là giới hạn của sudo mà nó không xử lý những thứ mà nó không bao giờ nhìn thấy. :) Tôi thường cố gắng gọi nó là "quy trình công việc sudo" hoặc một số thuật ngữ tương tự khi tôi giải thích nó, thay vì mô tả chính sudo.
dannysauer

sudo tee -aIMHO là một lạm dụng của tee. Sử dụng sudo cat, sudo ddhoặc (với hiệu suất tốt nhất trong nhiều trường hợp) sudo buffernếu bạn không cần nhiều đầu ra.
Eugen Rieck

70

Nó thực tế giống nhau và cần ít lần nhấn bàn phím hơn để gõ.

Nó hoàn toàn không giống nhau ...

Những điều sau đây có vẻ tương đương nhau, nhưng chúng không phải là:

$ echo "hi" > test.txt
$ echo "hi" | tee test.txt
hi

Sự khác biệt quan trọng là cái trước chỉ ghi dữ liệu vào tệp được đặt tên, trong khi cái sau đã ghi hivào terminal ( stdout) tệp được đặt tên, như hiển thị bên dưới:

chuyển hướng vs tee


teecho phép bạn ghi dữ liệu vào một tệp sử dụng nó trong một đường dẫn trở đi, cho phép bạn thực hiện những việc hữu ích - như giữ dữ liệu giữa chừng thông qua một đường ống:

grep '^look ' interesting_file.txt \
  | tee interesting_lines.txt \
  | sort

Hoặc, bạn có thể ghi vào một tệp có các đặc quyền nâng cao, mà không đưa ra toàn bộ đặc quyền nâng cao đường ống (ở đây echođược chạy với tư cách là người dùng, trong khi teeghi vào tệp dưới dạng root):

echo 0 \
  | sudo tee /proc/sys/net/ipv4/ip_forward

Với tee, bạn có thể ghi vào nhiều tệp ( stdout ):

echo "hi" \
  | tee a.txt b.txt

Cũng có thể sử dụng execvới teeđể ghi lại tất cả các đầu ra của kịch bản vào một tập tin, trong khi vẫn cho phép một người quan sát ( stdout) để xem dữ liệu:

exec > >( tee output.log )

2
Đừng quên exec > >(tee "$LOGFILE") 2>&1trong một tập lệnh bash cho phép tập lệnh xuất ra thiết bị xuất chuẩn và thiết bị xuất chuẩn cho cả hai, thiết bị xuất chuẩn và tập tin được trỏ tới $LOGFILE.
rexkogitans

@rexkogitans 2> & 1 không phải là cú pháp lô cmd?
dmb

@dmb: Đó là cú pháp shell cho "gửi stderr (= 2) đến cùng một nơi với stdout (= 1)"
psmears

@rexkogitans Đó thực sự là một câu hỏi công bằng, tôi thực sự không thể biết rằng bạn đã sử dụng "Windoze" trong một thập kỷ. Tôi sử dụng 2>&1để thả đầu ra và err to txt các tập tin trong windows.
dmb

1
@dmb Tôi xin lỗi vì nghe có vẻ thô lỗ. Đó là tất cả về bình luận của psmears. Rõ ràng, Windows đã áp dụng phong cách Unix ở đây.
rexkogitans

27

Đây là một tee:
nhập mô tả hình ảnh ở đây

Một ống hình chữ T phù hợp. Nó có một đầu vào, và hai cửa hàng riêng biệt.
Nói cách khác, nó chia một ống thành hai; như một ngã ba đường.

Tương tự, teelà một đường ống ( |) cho phép bạn chuyển hướng đầu vào tiêu chuẩn của bạn sang hai đầu ra riêng biệt.


Ví dụ
Nói ví dụ, bạn gõ ls /.
Bạn sẽ nhận được một đầu ra trông giống như:

Applications    Network     Users       bin        dev      net      private    tmp         var
Library         System      Volumes     cores      etc      home     opt        sbin        usr

Chuyển hướng đầu ra sang tệp văn bản ls / > ls.txtvà không có đầu ra nào được hiển thị trong trình bao, chỉ trong tệp văn bản kết quả.

Bạn muốn xem đầu ra, VÀ chuyển nó vào một tệp văn bản cùng một lúc?
Thêm a teevào ống của bạn ( |) tức là:ls / | tee ls.txt


So sánh hai:

ls /          >          ls.txt
ls /        | tee        ls.txt

4
+1 cho hình ảnh mà như chúng ta biết là đáng giá ngàn lời nói
Sergiy Kolodyazhnyy

Nếu bạn đã chọn một mảnh vòi ống trong vườn, bạn sẽ phù hợp với phép ẩn dụ ban đầu của Doug McIlroy.
JdeBP

@JdeBP Xin lỗi, tôi không biết đó là ai. Ông là tác giả ban đầu của tiện ích hay cái gì đó? Luồng dữ liệu & dòng điện vật lý thường được so sánh với các hệ thống thủy lực, nhưng bạn có thể biết điều đó. Dù sao, tôi chỉ chọn phong cách này để giữ cho nó siêu đơn giản. Tôi thực sự sẽ làm điều đó để giữ cho nó quen thuộc, nhưng giống vườn có xu hướng có hình dạng chữ Y và / hoặc các tệp đính kèm phức tạp về mặt hình ảnh để gắn phụ kiện, v.v ... Về cơ bản là giống nhau.
lên tiếng


18

Không. Bạn tình cờ đề cập đến một trong số ít ví dụ mà bạn thực sự có thể chuyển hướng đến tệp bằng cách sử dụng >>>toán tử.

Nhưng Tee có thể làm nhiều hơn thế. Bởi vì bạn dẫn đến nó, sau đó bạn có thể dẫn đến một cái gì đó khác.

Một ví dụ điển hình được liệt kê trên trang wikipedia :

find "4DOS" wikipedia.txt | tee 4DOS.txt | sort > 4DOSsorted.txt

Về cơ bản, bạn có thể chuyển sang Tee, do đó bạn có thể chuyển từ Tee sang một thứ khác. Nếu tất cả những gì bạn muốn làm là viết một tệp nhật ký, vâng, thì bạn không thực sự cần Tee.


17

teelà xa vô dụng. Tôi sử dụng nó mọi lúc và vui mừng vì nó tồn tại. Đây là một công cụ rất hữu ích nếu bạn có một đường ống mà bạn muốn tách ra. Một ví dụ rất đơn giản là bạn có một số thư mục $dmà bạn muốn tar và bạn cũng muốn băm nó vì bạn bị hoang tưởng (như tôi) và không tin tưởng vào phương tiện lưu trữ để giữ dữ liệu một cách đáng tin cậy. Bạn có thể ghi nó vào đĩa trước và sau đó băm nó, nhưng điều đó sẽ thất bại nếu kho lưu trữ bị hỏng trước khi băm. Hơn nữa, bạn sẽ phải đọc nó và nếu bạn làm việc trên các tệp có kích thước vài trăm GB, bạn sẽ biết rằng bạn thực sự không muốn đọc lại nếu không cần phải đọc lại.

Vì vậy, những gì tôi làm chỉ đơn giản là thế này:

tar -c "$d" | tee >(sha256sum) >(cat > "$d"".tar") > /dev/null

Nó tạo ra quả bóng nhựa và dẫn nó tới tee, sau đó đưa nó vào hai vỏ phụ, trong đó một cái được băm và trong đó cái kia được ghi vào đĩa.

Thật tuyệt vời nếu bạn muốn thực hiện một số thao tác trên một tệp lớn:

< file.tar.gz tee >(sha256sum) >(tar -xz) /other/storage/location/file.tar.gz > /dev/null

Đọc tệp một lần, băm nó (vì vậy bạn có thể kiểm tra xem nó có còn như vậy không), trích xuất và sao chép nó vào một vị trí khác. Không cần phải đọc nó ba lần cho điều đó.


3
Nitpick: teekhông tạo ra các subshells; shell gọi sẽ chạy sha5sumcatkết nối đầu ra của chúng với các bộ mô tả tệp được truyền tới tee. Ngoài ra, một cách sử dụng vô dụng cat; bạn có thể sử dụng chuyển hướng đầu vào để teeđọc trực tiếp từ file.tar.gz.
chepner

@chepner Bạn nói đúng về lần can thiệp đầu tiên nhưng bạn hoàn toàn sai về lần thứ hai. Tôi thích viết các đường ống của mình theo thứ tự, vì vậy việc biểu thị đầu vào ở bên phải rất tệ cho khả năng đọc và làm như vậy rõ ràng là khách quan so với phương pháp của tôi và hoàn toàn không phải là một sở thích chủ quan của tôi. catlà tình yêu. catlà cuộc sống.
UTF-8

6
Bạn cũng có thể viết < file.tar.gz tee >(sha256sum) ...nếu bạn quan tâm đến thứ tự từ vựng của các chuyển hướng. Điều đó không thay đổi thực tế rằng không cần một quy trình hoàn toàn riêng biệt chỉ để cung cấp một tệp duy nhất tee.
chepner

1
@chepner Tuyệt, cảm ơn bạn! Đã học được điều gì hôm nay. :)
UTF-8

1
Chi phí bắt đầu cat tương đối thấp. Chi phí cho hơn 100 GiB của các cuộc gọi hệ thống ghi + đọc chắc chắn sẽ lãng phí thêm thời gian CPU và băng thông bộ nhớ cho ví dụ đề xuất của bạn về một tệp khổng lồ. Hãy nhớ rằng băng thông bộ nhớ là tài nguyên được chia sẻ trên tất cả các lõi, chưa kể đến sự ô nhiễm thêm của bộ đệm L3 từ bản sao đó. Trên x86 có bật giảm thiểu Spectre + Meltdown, các cuộc gọi hệ thống đắt hơn so với trước đây. Bạn đang sử dụng hết lượng thời gian CPU bổ sung có thể đo được trong quá trình sao chép đó. Cũng >(cat > foo)không dễ hiểu hơn foo, IMO.
Peter Cordes

12

Câu trả lời của Nitpick trên @ bertieb cho biết Ví dụ này cho thấy tee được sử dụng để vượt qua giới hạn vốn có trong lệnh sudo. sudo không thể dẫn đầu ra tiêu chuẩn vào một tập tin.

Không có giới hạn cố hữu, chỉ có một sự hiểu lầm về cách xử lý lệnh.

Thí dụ:

sudo echo 0 > /proc/sys/net/ipv4/ip_forward

Các vỏ hiện phân tích các dòng lệnh. Nó tìm thấy sự chuyển hướng đầu ra và thực hiện điều đó. Sau đó, nó thực thi lệnh, đó là sudovà cung cấp dòng lệnh còn lại làm đối số cho lệnh được thực thi. Nếu hệ vỏ hiện tại không có quyền root thì chuyển hướng đầu ra sẽ thất bại.

echo 0 | sudo tee /proc/sys/net/ipv4/ip_forward

Điều này hoạt động vì chuyển hướng đầu ra được hoãn lại với teelệnh, tại thời điểm đó không có quyền root vì nó được thực thi thông qua sudo.

sudo bash -c "echo 0 > /proc/sys/net/ipv4/ip_forward"

Điều này hoạt động vì shell thực hiện chuyển hướng có quyền root.


2
Ngoài ra, bạn có thể cần sudolệnh, nhưng không phải cho tệp được xuất ra và chuyển hướng hoạt động tốt:sudo foo-needs-privilege > /tmp/this-output-file-doesnt
Dennis Williamson

10

Như những người khác đã đề cập, đầu ra đường ống cho teelệnh ghi đầu ra đó vào cả tệp và thiết bị xuất chuẩn.

Tôi thường sử dụng teekhi tôi muốn nắm bắt đầu ra từ một lệnh mất nhiều thời gian để chạy, trong khi cũng muốn kiểm tra trực quan đầu ra vì lệnh làm cho nó có sẵn. Bằng cách đó, tôi không phải đợi lệnh chạy xong trước khi kiểm tra đầu ra.

Điều dường như chưa được đề cập (trừ khi tôi bỏ lỡ), đó là teelệnh cũng có thể ghi vào nhiều tệp cùng một lúc. Ví dụ:

ls *.png | tee a.txt b.txt

sẽ ghi tất cả các *.pngtệp trong thư mục hiện tại vào hai tệp khác nhau ( a.txtb.txt) cùng một lúc.

Trên thực tế, bạn có thể nhập văn bản vào nhiều tệp khác nhau cùng một lúc teenhư sau:

$ tee --append a.txt b.txt c.txt d.txt
These lines are appended to four different files,
and are also written to stdout.
CTRL-D

9

Việc sử dụng tee phổ biến nhất là xem văn bản trên thiết bị đầu cuối cùng lúc bạn gửi nó đến tệp (hoặc tệp). Từ ngữ của câu hỏi của bạn giả sử bạn chỉ viết văn bản cho logfiles. Tôi có các tập lệnh viết danh sách tên tệp hoặc tên thư mục để kích hoạt các tệp (sẽ được xử lý không đồng bộ bởi các tập lệnh khác) và tôi sử dụng tee để gửi cùng một nội dung đến thiết bị xuất chuẩn. Tất cả các thiết bị xuất chuẩn được hướng đến các bản ghi. Vì vậy, tôi có văn bản của mình ở nơi tôi muốn và tôi có một bản ghi mục nhập nhật ký mà tôi đã làm điều này, tất cả chỉ từ một câu lệnh 'echo'

tee cũng là phương pháp tốt nhất trong Unix để tạo nhiều tệp giống nhau. Thỉnh thoảng tôi sử dụng nó để tạo nhiều tệp trống, như thế này ...

:|tee file01 file02 file03

5
tại sao không touch? (rõ ràng hơn ngay lập tức những gì đang xảy ra)
Attie

@Attie touchsẽ không cắt bớt các tệp nếu chúng đã tồn tại mà chỉ cập nhật dấu thời gian của chúng và để nguyên nội dung của chúng; nhưng teesẽ cắt bớt chúng. Ngoài ra, làm rm+ touchkhác với tee(nghĩ về liên kết cứng và liên kết tượng trưng)
Matija Nalis

Vậy thì tại sao không truncate -s 0? :-)
Attie

1

Hãy tưởng tượng, bạn muốn ghi đầu ra của lệnh vào tệp nhật ký in ra thiết bị xuất chuẩn. Khi bạn cần làm điều đó cùng một lúc, thì bạn cần tee.

Một trường hợp sử dụng là có các tập lệnh xây dựng ghi toàn bộ bản dựng vào thiết bị xuất chuẩn (ví dụ: đối với Jenkins) nhưng nội dung quan trọng đồng thời vào một tệp nhật ký riêng (đối với các email tóm tắt).

Bạn sẽ thực sự bắt đầu mất tích teekhi bạn phải viết script trong Windows. Không có teevà điều đó thực sự gây phiền nhiễu.


Nó không phải là tầm thường để tạo ra?
Các cuộc đua nhẹ nhàng trong quỹ đạo

Không thể với lô / cmd vì bạn không thể tách luồng đầu ra khỏi lệnh một cách dễ dàng.
domih

Phải nhưng giống như một chương trình C ++ ba dòng ...
Các cuộc đua nhẹ nhàng trong quỹ đạo

1
Bản phân phối unxutils của Windows có nhiều công cụ dòng lệnh Unix, không giống như một số bản phân phối, không gây ô nhiễm môi trường thực thi Windows của bạn. Hạn chế lớn nhất là trên bing "global", hoạt động khác với Unix / Linux so với Windows. "Tee" là một trong những công cụ có sẵn.
cmm

2
Đừng ngớ ngẩn, đó là năm 2018. Sử dụng Powershell, nó có tee. Cmd không bao giờ có ý định cho kịch bản nghiêm túc - đó là những gì VBS dành cho. Powershell là công cụ viết kịch bản mới. Cấp, Cmd vẫn còn khá mạnh, nhưng các công cụ dòng lệnh khá ít.
Luaan
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.