İki argümanı borular kullanarak bir komuta geçirmek


22

Genellikle, sadece bir argüman geçmemiz gerekir:

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

İki argümanı geçmenin bir yolu var mı? Gibi bir şey

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

Her iki sonucu da önce bir dosyada saklayabilirim

echo abc > file1
echo xyz > file2
cat file1 file2

Ama sonra yanlışlıkla bir dosyanın üzerine yazabilirim, bu sorun değil. Bu etkileşimli olmayan bir komut dosyasına giriyor. Temel olarak, iki keyfi komutun sonuçlarını catbir dosyaya yazmadan geçmek için bir yola ihtiyacım var .


GÜNCELLEME: Üzgünüm, örnek sorunu gizliyor. İken { echo abc ; echo xyz ; } | catişe görünüyor, çıkış nedeni olan echo, s değil cat.

{ cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,Beklendiği gibi çalışmayan daha iyi bir örnek olabilir .

İle

file1:
a,b
c,d

file2:
1,2
3,4

Beklenen çıktı:

b,1
d,3

RESOLVED:

Proses ikamesi kullan :cat <(command1) <(command2)

Alternatif olarak, aşağıdakileri kullanarak adlandırılmış yöneltmeler yapın mkfifo:

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

Daha az zarif ve daha ayrıntılı, ancak temp1 ve temp2'nin elden önce var olmadığından emin olduğunuz sürece iyi çalışır.


1
Bu beni kafamı çizdiriyor. İki farklı komutu tek bir kediye yönlendirmek mi istiyorsunuz?
user606723

2
"Borular" ve "argümanlar" ın birbiriyle tamamen ilişkili olmayan iki kavram olduğunu biliyorsunuz, değil mi?
Ignacio Vazquez-Abrams,

@Ignacio err ... Ben Linux ile aşina değilim bu yüzden gerçekten farkı bilmiyorum. Her zaman boru tesisatının önceki sonucu argüman olarak alması anlamına geldiğini düşünürdüm. Beni aydınlatmak ister misin?
goweon

@firebat no, pipe, bir sonraki komutun standart girişi olarak önceki komutun stdout'unu almak anlamına gelir. Farklı bir kavram olan argümanlara hala sahip olabilirsiniz.
Rich Homolka

Ayrıca, Güncelleme metninize bakıldığında, çıktı kediden gelir; yalnızca ifadelerin tek bir akışta serileştirildiğinden beri yapamayacağı, kediden ayrı görünmesini istersiniz.
Rich Homolka

Yanıtlar:


17

Sanırım 'İkame İşlemi' istiyorsun http://tldp.org/LDP/abs/html/process-sub.html . Daha fazla seçeneğe sahip olmasına rağmen sözdizimi farklı olsa da, zsh üzerinde de çalışır.

/dev/fd/somethingHer değiştirme için bir sözde dosya ( ) oluşturur . Oldukça faydalı. Komut yalnızca bir akış olarak okuyabilir, bu da fseek ile ileri ve geri dönemeyeceği anlamına gelir. Bir boru gibi bir bayt akışı olarak okuması gerekiyor.

Örnekleriniz proses ikame olarak çalışıyor:

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

Bir işlemi kullanmak için bir araç olarak düşünün ve herhangi bir geçici dosya içermeyen bir dosya gibi görünmesini sağlayın.

( önceki cevabımdan )


2

Kıvrımlı parantezler gerçekte işe yaradı çünkü boru operatörü gruplanmış komutların standart çıkışlarını üçüncülerin standart girişine bağlayacak.

Çıktının standart girdi kullanmayan herhangi bir komutu çalıştırarak echos'tan olmadığını söyleyebilirsiniz, örneğin { echo 1; echo 2;} | echo 31 \ n2 \ n3 yerine 3 yazdıracaktır.

Bununla birlikte, istediğiniz şey bu değildir, çünkü küme parantezindeki iki komut cat, sonuçları çıktıran aynı çıktıya yazmaktadır . Komutlar için iki argüman olarak kullanılacak iki farklı sonuç üretmek için pastegeçici bir dosya veya adlandırılmış bir kanal kullanmanız gerekir.

Sen kullanabilirsiniz mktempbenzersiz bir geçici dosya oluşturmak için veya mkfifobir FIFO boru dosyası oluşturmak için.


Cevabınız için büyük bir teşekkür, bu çözüm için çok fazla gün aradım ve sonunda cevabınızı burada buldum.
Saeed Falsafin

2

Xargs'i severim Örnek olarak, / usr / local altındaki tüm mysql verilerinin boyutunu bulmak istiyorum.

osx: yerel kullanıcı $ pwd
/ Usr / local
osx: yerel kullanıcı $ 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: yerel kullanıcı $ ls | grep mysql | sudo xargs du -sh
4.0K mysql
2,8 G, 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: yerel kullanıcı $ 

xargs

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.