Melewati dua argumen ke perintah menggunakan pipa

22

Biasanya, kita hanya perlu melewati satu argumen:

echo abc | cat
echo abc | cat some_file -
echo abc | cat - some_file

Apakah ada cara untuk menyampaikan dua argumen? Sesuatu seperti

{echo abc , echo xyz} | cat
cat `echo abc` `echo xyz`

Saya hanya bisa menyimpan kedua hasil dalam file terlebih dahulu

echo abc > file1
echo xyz > file2
cat file1 file2

Tapi kemudian saya mungkin tidak sengaja menimpa file, yang tidak ok. Ini akan menjadi skrip non-interaktif. Pada dasarnya, saya perlu cara untuk meneruskan hasil dari dua perintah sewenang-wenang cattanpa menulis ke file.


PEMBARUAN: Maaf, contohnya menutupi masalah. Meskipun { echo abc ; echo xyz ; } | cattampaknya berfungsi, outputnya adalah karena echos, bukan cat.

Contoh yang lebih baik adalah { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,yang tidak berfungsi seperti yang diharapkan.

Dengan

file1:
a,b
c,d

file2:
1,2
3,4

Output yang diharapkan adalah:

b,1
d,3

TERSELESAIKAN:

Gunakan substitusi proses :cat <(command1) <(command2)

Atau, buat pipa bernama menggunakan mkfifo:

mkfifo temp1
mkfifo temp2
command1 > temp1 &
command2 > temp2 &
cat temp1 temp2

Kurang elegan dan lebih bertele-tele, tetapi berfungsi dengan baik, selama Anda memastikan temp1 dan temp2 tidak ada sebelumnya.

goweon
sumber
1
Ini membuat saya menggaruk kepala. Anda ingin menyalurkan dua perintah berbeda ke satu kucing?
user606723
2
Anda tahu bahwa "perpipaan" dan "argumen" adalah dua konsep yang sama sekali tidak terkait, kan?
Ignacio Vazquez-Abrams
@Ignacio err ... Saya tidak begitu mengenal Linux, jadi saya tidak begitu tahu bedanya. Saya selalu berpikir perpipaan berarti dibutuhkan hasil sebelumnya sebagai argumen. Mau mencerahkanku?
goweon
@firebat tidak, pipa berarti mengambil stdout dari perintah sebelumnya sebagai input standar dari perintah berikutnya. Anda masih dapat memiliki argumen, yang merupakan konsep yang berbeda.
Rich Homolka
juga, sejauh teks Pembaruan Anda, output memang berasal dari cat, hanya Anda ingin pernyataan itu tampak terpisah dari cat, yang tidak dapat dilakukan karena mereka diserialisasi ke dalam satu aliran.
Rich Homolka

Jawaban:

17

Saya pikir Anda ingin 'Proses Substitusi' http://tldp.org/LDP/abs/html/process-sub.html . Ini juga berfungsi pada zsh, meskipun memiliki lebih banyak opsi dan sintaks mungkin berbeda.

Ini membuat file pseudo ( /dev/fd/something) untuk setiap substitusi. Ini sangat berguna. Perintah hanya bisa dibaca sebagai stream, artinya tidak bisa bolak-balik dengan fseek. Perlu membacanya sebagai aliran byte, seperti pipa.

Contoh Anda berfungsi sebagai pengganti proses:

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

Anggap saja sebagai alat untuk menggunakan proses dan memilikinya berpura-pura menjadi file tanpa file temp.

(dari jawaban saya sebelumnya )

Homolka yang kaya
sumber
2

Kurung kurawal benar-benar berfungsi karena operator pipa akan menghubungkan output standar dari perintah yang dikelompokkan ke input standar dari ketiga.

Anda dapat mengatakan bahwa hasil cetak bukan dari gema dengan menjalankan perintah apa pun yang tidak menggunakan input standar, misalnya { echo 1; echo 2;} | echo 3akan mencetak 3 sebagai lawan dari 1 \ n2 \ n3.

Namun, ini bukan hal yang Anda inginkan karena dua perintah di kurung kurawal menulis ke output yang sama seperti cat-ing hasil mereka. Untuk menghasilkan dua hasil berbeda untuk digunakan sebagai dua argumen untuk perintah seperti paste, Anda harus menggunakan file sementara atau pipa bernama.

Anda dapat menggunakan mktempuntuk menghasilkan file sementara yang unik atau mkfifountuk membuat file pipa FIFO.

billc.cn
sumber
Terima kasih banyak atas jawaban Anda, saya mencari banyak hari untuk solusi ini dan akhirnya menemukan jawaban Anda di sini.
Saeed Falsafin
2

Saya suka xargs Sebagai contoh saya ingin menemukan ukuran semua dir data mysql di bawah / usr / local

osx: pengguna lokal $ pwd
/ usr / lokal
osx: pengguna lokal $ ls | grep mysql
mysql
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: pengguna lokal $ ls | grep mysql | sudo xargs du -sh
4.0K mysql
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: pengguna lokal $ 

xargs

colek
sumber