Truyền hai đối số cho một lệnh bằng cách sử dụng đường ống


22

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 ý catmà 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 ; } | catdường như không hoạt động, đầu ra là do echos, 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.


1
Điều này làm tôi gãi đầu. Bạn muốn đặt hai lệnh khác nhau cho một con mèo?
user606723

2
Bạn có biết rằng "đường ống" và "đối số" là hai khái niệm hoàn toàn không liên quan, phải không?
Ignacio Vazquez-Abrams

@Ignacio err ... Tôi không quen với Linux nên tôi không thực sự biết sự khác biệt. Tôi luôn nghĩ rằng đường ống có nghĩa là nó lấy kết quả trước đó làm đối số. Quan tâm để soi sáng cho tôi?
Goweon

@firebat không, ống có nghĩa là lấy thiết bị xuất chuẩn của lệnh trước làm đầu vào tiêu chuẩn của lệnh tiếp theo. Bạn vẫn có thể có các đối số, đó là một khái niệm khác.
Rich Homolka

Ngoài ra, theo như văn bản Cập nhật của bạn, đầu ra không phải là con mèo, chỉ là bạn muốn các câu lệnh dường như tách biệt với con mèo, điều này không thể làm được vì chúng được nối tiếp thành một luồng.
Rich Homolka

Câu trả lời:


17

Tôi nghĩ rằng bạn muốn 'Thay thế quy trình' http://tldp.org/LDP/abs/html/ process- sub.html . Nó cũng hoạt động trên zsh, mặc dù nó có nhiều tùy chọn hơn và cú pháp có thể khác nhau.

Nó tạo ra một tệp giả ( /dev/fd/something) cho mỗi lần thay thế. Nó khá hữu ích. Lệnh chỉ có thể đọc dưới dạng một luồng, có nghĩa là nó không thể qua lại với fseek. Nó cần phải đọc nó như một luồng byte, giống như một đường ống.

Ví dụ của bạn hoạt động như thay thế quá trình:

cat <(echo abc) <(echo xyz)
paste -d, <(cut -f2 -d, file1) <(cut -f1 -d, file2)

Hãy nghĩ về nó như một công cụ để sử dụng một quá trình và giả vờ là một tệp mà không có bất kỳ tệp tạm thời nào.

(từ câu trả lời trước đó của tôi )


2

Các dấu ngoặc nhọn thực sự hoạt động vì toán tử đường ống sẽ kết nối các đầu ra tiêu chuẩn của các lệnh được nhóm thành đầu vào tiêu chuẩn của thứ ba.

Bạn có thể nói bản in không phải từ echos bằng cách chạy bất kỳ lệnh nào không sử dụng đầu vào tiêu chuẩn, ví dụ như { echo 1; echo 2;} | echo 3sẽ in 3 trái ngược với 1 \ n2 \ n3.

Tuy nhiên, đây không phải là điều bạn muốn bởi vì hai lệnh trong dấu ngoặc nhọn đang ghi vào cùng một đầu ra giống như catkết quả của chúng. Để tạo hai kết quả khác nhau để sử dụng làm hai đối số cho các lệnh như paste, bạn sẽ phải sử dụng tệp tạm thời hoặc đường ống có tên.

Bạn có thể sử dụng mktempđể tạo một tệp tạm thời duy nhất hoặc mkfifođể tạo tệp ống FIFO.


Cảm ơn rất nhiều vì câu trả lời của bạn, tôi đã tìm kiếm rất nhiều ngày cho giải pháp này và cuối cùng đã tìm thấy câu trả lời của bạn ở đây.
Saeed Falsafin

2

Tôi thích xargs Như một ví dụ tôi muốn tìm kích thước của tất cả các thư mục dữ liệu mysql dưới / usr / local

osx: người dùng địa phương $ pwd
/ usr / địa phương
osx: người dùng địa phương $ ls | grep mysql
mys
mysql-5.0.51a-osx10.5-x86_64
mysql-5.0.51b-osx10.5-x86_64
mysql-5.1.39-osx10.5-x86_64
mysql-5.6.17-osx10.7-x86_64
os x: người dùng cục bộ $ ls | grep mysql | sudo xargs du -sh
Máy tính cá nhân 4.0K
2.8G mysql-5.0.51a-osx10.5-x86_64
 10G mysql-5.0.51b-osx10.5-x86_64
 25G mysql-5.1.39-osx10.5-x86_64
753M mysql-5.6.17-osx10.7-x86_64
osx: người dùng địa phương $ 

xargs

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.