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 cat
tanpa menulis ke file.
PEMBARUAN: Maaf, contohnya menutupi masalah. Meskipun { echo abc ; echo xyz ; } | cat
tampaknya berfungsi, outputnya adalah karena echo
s, 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.
Jawaban:
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:
Anggap saja sebagai alat untuk menggunakan proses dan memilikinya berpura-pura menjadi file tanpa file temp.
(dari jawaban saya sebelumnya )
sumber
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 3
akan 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 sepertipaste
, Anda harus menggunakan file sementara atau pipa bernama.Anda dapat menggunakan
mktemp
untuk menghasilkan file sementara yang unik ataumkfifo
untuk membuat file pipa FIFO.sumber
Saya suka xargs Sebagai contoh saya ingin menemukan ukuran semua dir data mysql di bawah / usr / local
xargs
sumber