Bir dosya ve çıktıyı komuttan nasıl ayırt edersiniz?


32

Normalde şöyle yazarsınız:

diff file1 file2

Fakat bir dosya ve çıktıyı komuttan ayırmak istiyorum (burada komutu önemsiz bir dosya haline getirdim):

diff file1 <(cat file2 | sort)

Tamam, bu kabuk isteminde el ile girdiğimde çalışır, ancak tam olarak aynı satırı kabuk betiğine koydum ve sonra komut dosyasını çalıştırdığımda, hata alıyorum.

Öyleyse, soru şu - bu nasıl doğru şekilde yapılır?

Elbette çıktıyı geçici bir dosyaya yazmaktan kaçınmak istiyorum.

Yanıtlar:


39

Senaryonuzun ve kabuğunuzun farklı olduğundan şüpheleniyorum. Belki #!/bin/shtercüman olarak yazınızın tepesinde varsınız ama bashkişisel kabuğunuz olarak kullanıyorsunuz . Terminalde hangi kabuğu çalıştırdığınızı öğrenerek bulabilirsiniz echo $SHELL.

Çoğu kabukta çalışması gereken bunu yapmanın daha kolay bir yolu, verdiğiniz dosya okuma operatörü yerine bir boru yönlendirmesi kullanmak olacaktır. '-' sembolü STDIN okumak için standart bir adlandırmadır ve bir argüman listesinde bir dosya isminin yerine sıkça kullanılabilir:

cat file2 | sort | diff file1 -

Veya işe yaramaz bir kedi kullanımını önlemek için :

sort < file2 | diff file1 -

Ah, sen iyisin, gerçekten, sh'in bash olup olmadığını kontrol etmedim. Çözüm için çok teşekkür ederim.
greenoldman

Stdout ile dosya farklı. Şimdi bir dosyaya stdout nasıl eklenir? Yani, ters yön. öyle -Rkullanılması durumundagit diff --no-index
Nakilon

@Nakilon sadece argüman sırasını değiştirmek olacaktır: diff - file1.
Caleb

Güzel. Bu işe yaramadı git diff.
Nakilon

@Nakilon Tabii ki hayır, neden olmasın? git difftamamen farklı bir canavardır ve dosyaları değil, kendi dizinindeki glob nesnelerine referanslar üzerinde çalışır; diffdosya sisteminde çalışır. -Sözdizimi sadece sözdizimsel şeker kabuk olan /dev/stdinSTDIN akışı temsil eden dosya. Bu nedenle diff, neden onu bir dosya adının yerine kullanabilirsiniz? Bu arada git diffdosya aramıyor, nesneleri arıyor, bu yüzden tanıdığı bir şeyi iletmeniz gerekiyor. Dosyaları birbirleriyle karşılaştırmak için kullanmayın, bunun için kullanın diff.
Caleb

-4

Standart girişin kapsamı betiğin kendisidir, bu yüzden kodunuzu şöyle bir bloğun içine koyun:

{
  diff file1 <(sort file2)
}

Bu şekilde STDIN'in kapsamı bloğun içindedir.

Denedim ve işe yarıyor.


Bu bir işlev değil, bir blok ve hiçbir fark yaratmıyor.
Gilles 'SO- kötülük' dur

Gilles düzeltme için Thx. Btw kendimi denedim ve işe yarıyor. Sen yaptın mı
tmow

3
Bloğun yapının geçerliliği üzerinde hiçbir etkisi yoktur <(…). Komut dosyanız, destekleyen <(…)veya desteklemeyen bir kabukta çalıştırmanıza bağlı olarak çalışmayacak veya çalışmayacaktır (ksh93 / bash / zsh - Bourne / ash / kshk88). Caleb'in cevabı hepsini çiviler.
Gilles 'SO- kötülük olmayı bırak'

1
@gilles tamam, açıklama için teşekkürler.
tmow
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.