Saya membayangkan cara paling sederhana untuk membandingkan isi dari dua direktori yang sama akan menjadi sesuatu seperti
diff `ls old` `ls new`
Tetapi saya mengerti mengapa ini tidak berhasil; diff
sedang diserahkan daftar panjang file di baris perintah, bukan dua aliran seperti yang saya harapkan. Bagaimana cara melewatkan kedua output untuk berbeda secara langsung?
command-line
diff
Ternary
sumber
sumber
Jawaban:
Substitusi perintah mengganti
`…`
output dari perintah ke baris perintah, jadidiff
lihatlah daftar file di kedua direktori sebagai argumen. Yang Anda inginkan adalah untukdiff
melihat dua nama file pada baris perintahnya, dan isi dari file-file ini menjadi daftar direktori. Itulah yang dilakukan proses substitusi .Argumen untuk
diff
akan terlihat seperti/dev/fd/3
dan/dev/fd/4
: mereka adalah deskriptor file yang sesuai dengan dua pipa yang dibuat oleh bash. Saatdiff
membuka file-file ini, itu akan terhubung ke sisi baca dari setiap pipa. Sisi tulis setiap pipa terhubung kels
perintah.sumber
echo <(echo) <(echo)
tidak pernah berpikir ini bisa sangat menarik: Dls
adalah bahwa file nama mangles. Parsing hasilnya rapuh (tidak bekerja dengan nama file "aneh"). Untuk membandingkan dua daftar direktori, tidak apa-apa asalkan outputnya tidak ambigu. Dengan nama file yang sewenang-wenang, ini akan membutuhkan opsi seperti--quoting-style=escape
.<(…)
membuat pipa. Tampaknya berbaur tidak bekerja dengan pipa, jadi Anda tidak dapat menggunakan<(…)
. Di zsh, Anda dapat menggantinya<(…)
dengan=(…)
dan itu akan berfungsi karena=(…)
menempatkan output antara dalam file sementara. Dalam bash saya tidak berpikir ada sintaks yang mudah digunakan, Anda harus mengelola sendiri file-file sementara.Untuk zsh, menggunakan
=(command)
secara otomatis membuat file sementara dan menggantikan=(command)
dengan jalur file itu sendiri. Dengan Substitusi Perintah,$(command)
diganti dengan output dari perintah.Jadi ada tiga opsi:
$(...)
<(...)
=(...)
Subsitusi proses rasa zsh, # 3, sangat berguna dan dapat digunakan seperti itu untuk membandingkan output dari dua perintah menggunakan alat diff, misalnya Beyond Compare:
Untuk Beyond Compare, perhatikan bahwa Anda harus menggunakan
bcomp
untuk yang di atas (bukanbcompare
) sejakbcomp
meluncurkan perbandingan dan menunggu untuk menyelesaikan. Jika Anda menggunakanbcompare
, itu meluncurkan perbandingan dan segera keluar karena file sementara yang dibuat untuk menyimpan output dari perintah menghilang.Baca lebih lanjut di sini: http://zsh.sourceforge.net/Intro/intro_7.html
Perhatikan juga ini:
dan berikut ini yang merupakan perbedaan antara dua jenis subtitusi Proses yang didukung oleh zsh (yaitu # 2 dan # 3):
Referensi: https://unix.stackexchange.com/questions/393349/difference-between-subshells-and-process-substitution
sumber
$(...)
bukan proses substitusi, itu substitusi perintah .<(...)
adalah proses substitusi. Itu sebabnya bagian yang dikutip tidak menyebutkan$(...)
sama sekali.Kulit ikan
Dalam shell Ikan Anda harus pipa ke psub . Berikut adalah contoh perbandingan konfigurasi heroku dan dokku dengan Beyond Compare :
sumber
meld
yang open source dan tersedia di repositori Ubuntu dan EPEL. meldmerge.orgSaya sering menggunakan teknik yang dijelaskan dalam jawaban yang diterima:
tetapi saya menemukan bahwa saya biasanya menggunakannya dengan perintah yang jauh lebih kompleks daripada contoh di atas. Dalam kasus-kasus seperti itu dapat mengganggu untuk membuat perintah diff. Saya telah menemukan beberapa solusi yang mungkin berguna bagi orang lain.
Saya menemukan bahwa 99% dari waktu saya mencoba perintah yang relevan sebelum menjalankan diff. Konsekuensinya, perintah yang ingin saya perbaiki ada di sana dalam riwayat saya ... mengapa tidak menggunakannya?
Saya menggunakan bash builtin Fix Command (fc) untuk menjalankan dua perintah terakhir:
Bendera fc adalah:
yang
-1
-1
mengacu pada awal dan akhir positing dalam sejarah, dalam hal ini yang dari perintah terakhir untuk perintah terakhir yang menghasilkan hanya perintah terakhir.Terakhir kita bungkus ini
$()
untuk menjalankan perintah dalam subkulit.Jelas ini agak sulit untuk diketik sehingga kita dapat membuat alias:
Atau kita dapat membuat fungsi:
yang mendukung menentukan garis sejarah yang akan digunakan. Setelah menggunakan keduanya saya menemukan alias adalah versi yang saya sukai.
sumber