Bagaimana cara membedakan file dan output dari perintah?


32

Biasanya Anda akan menulis:

diff file1 file2

Tapi saya ingin diff file dan output dari perintah (di sini saya membuat perintah yang sepele):

diff file1 <(cat file2 | sort)

Ok, ini berfungsi ketika saya memasukkan ini secara manual pada prompt shell, tetapi ketika saya meletakkan baris yang sama persis di skrip shell, dan kemudian menjalankan skrip, saya mendapatkan kesalahan.

Jadi, pertanyaannya adalah - bagaimana melakukan ini dengan benar?

Tentu saja saya ingin menghindari penulisan output ke file sementara.

Jawaban:


39

Saya menduga skrip Anda dan shell Anda berbeda. Mungkin Anda memiliki #!/bin/shbagian paling atas dari skrip Anda sebagai penerjemah tetapi Anda menggunakannya bashsebagai cangkang pribadi Anda. Anda dapat mengetahui shell apa yang Anda jalankan di terminal dengan menjalankan echo $SHELL.

Cara yang lebih mudah untuk melakukan ini yang seharusnya bisa digunakan di sebagian besar shell adalah dengan menggunakan pengalihan pipa alih-alih operator pembacaan file yang Anda berikan. Simbol '-' adalah nomenklatur standar untuk membaca STDIN dan sering dapat digunakan sebagai pengganti nama file dalam daftar argumen:

cat file2 | sort | diff file1 -

Atau untuk menghindari penggunaan kucing yang tidak berguna :

sort < file2 | diff file1 -

Ah, kamu bagus, memang, aku tidak memeriksa apakah dia bash atau tidak. Terima kasih banyak atas solusinya.
greenoldman

Ini adalah file diffing dengan stdout. Sekarang bagaimana cara membedakan stdout dengan file? Maksudku, arah sebaliknya. itu -Rdalam hal menggunakangit diff --no-index
Nakilon

@Nakilon Anda hanya akan mengubah urutan argumen: diff - file1.
Caleb

Keren. Ini tidak berhasil git diff.
Nakilon

@Nakilon Tentu saja tidak, mengapa? git diffadalah binatang yang sama sekali berbeda dan beroperasi pada referensi ke objek glob dalam indeks internalnya, bukan file; diffberoperasi pada sistem file. The -sintaks hanya shell sintaksis gula untuk /dev/stdin, file yang mewakili aliran STDIN. Karenanya mengapa diffdapat menggunakannya sebagai pengganti nama file. Sementara git diffitu tidak mencari file, itu mencari objek sehingga Anda harus memberikannya sesuatu yang dikenali. Jangan menggunakannya untuk membandingkan file satu sama lain, gunakan diffuntuk itu.
Caleb

-4

Cakupan input standar adalah skrip itu sendiri, jadi masukkan saja kode Anda di dalam blocku seperti ini:

{
  diff file1 <(sort file2)
}

Dengan cara ini ruang lingkup STDIN ada di dalam blok ..

Saya sudah mencoba dan berhasil.


Itu bukan fungsi, itu blok, dan tidak ada bedanya.
Gilles 'SO- berhenti bersikap jahat'

@ Gilles Thx untuk koreksi. BTW Saya sudah mencoba sendiri dan berhasil. Apakah kamu?
tmow

3
Blok tidak memengaruhi validitas <(…)konstruk. Skrip Anda akan berfungsi atau tidak, tergantung pada apakah Anda menjalankannya di shell yang mendukung <(…)atau tidak (ksh93 / bash / zsh vs Bourne / ash / kshk88). Jawaban Caleb memaku semuanya.
Gilles 'SO- stop being evil'

1
@ gilles ok, terima kasih untuk penjelasannya.
tmow
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.