ls
mengembalikan output dalam beberapa kolom, sedangkan ls|cat
mengembalikan byte-identik dengan ls -1
untuk direktori saya sudah mencoba. Masih saya lihat ls -1
disalurkan dalam jawaban, seperti ls -1|wc -l
. Apakah ada alasan untuk memilih ls -1
? Mengapa ...|cat
mengubah output ls
?
19
n=0; for i in .* *; do ((n++)) ; done ; echo $n
(jatuhkan. * jika Anda tidak ingin menghitungnya). atau:ls -1d ./.* ./* | grep '^\./' | wc -l
(karena nama file tidak boleh mengandung '/')ls
output ke terminal biasanya menyertakan kode warna secara default. Untuk output ke non-terminal, warna biasanya dinonaktifkan secara default. Di GNU, itu adalah--color={always,auto,never}
IIRC. Jika warna termasuk dalam satu tetapi bukan yang lain, maka output mungkin tampak identik pada layar, tetapi mereka tidak identik-byte (kode warna membentuk bagian dari output ls).Jawaban:
ls
menguji apakah output akan ke terminal. Jika output tidak menuju terminal, maka-1
defaultnya. (Ini dapat diganti dengan salah satu-C
,-m
atau-x
pilihan.)Jadi, ketika
ls
digunakan dalam pipa dan Anda belum menimpanya dengan opsi lain,ls
akan digunakan-1
. Anda dapat mengandalkan ini karena perilaku ini diperlukan oleh POSIXSpesifikasi POSIX
POSIX memerlukan
-1
sebagai default setiap kali output tidak pergi ke terminal:Spesifikasi POSIX :
Tiga opsi yang menggantikan format kolom tunggal default adalah:
Dokumentasi GNU
Dari manual GNU :
Contohnya
Mari kita membuat tiga file:
Ketika output masuk ke terminal, GNU
ls
memilih untuk menggunakan format multi-kolom:Ketika output beralih ke pipeline, spec POSIX mensyaratkan bahwa satu kolom adalah default:
Tiga pengecualian yang mengesampingkan perilaku kolom tunggal default adalah
-m
untuk dipisahkan dengan koma,-C
untuk kolom diurutkan ke bawah, dan-x
untuk kolom diurutkan di:sumber
-1
sebagai default kecuali ketika output pergi ke terminal (atau kondisi lainnya)Mengapa pemipaan output standar mengubah perilaku
ls
? Karena memang dirancang seperti itu. The POSIX Keterangan mengatakan:yang sebenarnya ambigu tentang perilaku default (ketika tidak ditentukan oleh opsi seperti
-l
atau-1
) dengan output ke terminal, dan dokumentasi GNU Coreutils mengatakanJadi Anda dapat melihat bahwa output ke file akan bertindak sama seperti output ke pipa; yaitu, satu entri per baris, seolah-olah
-1
telah ditentukan.ls
sedang menulis ke terminal, ia berharap bahwa manusia sedang melihat hasilnya. Orang akan lebih suka mendapatkan informasi dalam jumlah baris minimum yang diperlukan, sehingga barang tidak menggulung layar.ls
menulis ke sebuah pipa, ia berharap bahwa program lain membaca output. Jauh lebih mudah bagi sebuah program untuk membaca data yang satu nilai per baris daripada harus mencoba mem-parsing kolom (karena nama file dapat berisi spasi).ls -1
ketika Anda menulis ke file atau pipa? Tidak.sumber
Saat mem-pip ls, ls tidak dapat menentukan berapa banyak kolom yang sebenarnya dimiliki konsol (tidak tergantung pada perintah sisi kanan). Jadi, apakah itu dilakukan atas pilihannya sendiri, atau, dengan kata lain, perilaku ini tidak stabil dan dapat berubah di versi mendatang.
Sebaliknya,
ls -1
diciptakan untuk tujuan penghitungan atau scripting secara umum, sehingga perilakunya stabil.sumber