Thông thường, chúng ta chỉ cần truyền một đối số:
echo abc | cat
echo abc | cat some_file -
echo abc | cat - some_file
Có cách nào để vượt qua hai đối số? Cái gì đó như
{echo abc , echo xyz} | cat
cat `echo abc` `echo xyz`
Tôi chỉ có thể lưu trữ cả hai kết quả trong một tệp trước
echo abc > file1
echo xyz > file2
cat file1 file2
Nhưng sau đó tôi có thể vô tình ghi đè lên một tập tin, điều đó không ổn. Điều này sẽ đi vào một kịch bản không tương tác. Về cơ bản, tôi cần một cách để truyền kết quả của hai lệnh tùy ý cat
mà không cần ghi vào tệp.
CẬP NHẬT: Xin lỗi, ví dụ che giấu vấn đề. Trong khi { echo abc ; echo xyz ; } | cat
dường như không hoạt động, đầu ra là do echo
s, không phải cat
.
Một ví dụ tốt hơn sẽ { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,
không hoạt động như mong đợi.
Với
file1:
a,b
c,d
file2:
1,2
3,4
Sản lượng dự kiến là:
b,1
d,3
GIẢI QUYẾT:
Sử dụng thay thế quá trình :cat <(command1) <(command2)
Ngoài ra, làm cho các đường ống được đặt tên bằng cách sử dụng mkfifo
:
mkfifo temp1
mkfifo temp2
command1 > temp1 &
command2 > temp2 &
cat temp1 temp2
Ít thanh lịch và dài dòng hơn, nhưng hoạt động tốt, miễn là bạn đảm bảo temp1 và temp2 không tồn tại trước khi ra tay.