Apa pemisah ajaib antara nama file dalam output ls?

20

Output dari ls(tanpa argumen) muncul untuk memisahkan nama file dengan linebreak.

Bukti:

  • ls | grep fooberfungsi seperti yang diharapkan, dengan grepmemperlakukan setiap nama file sebagai jalur input yang terpisah.

  • ls > files.txt; vim files.txt -> di Vim, setiap file berada di baris yang terpisah

Namun di terminal output lsmenempatkan banyak file pada satu baris, memisahkan nama file dengan spasi untuk membuat kolom yang sejajar dengan baik:

$ ls
a.txt  b.txt  c.txt

Jadi pertanyaan saya adalah, bagaimana saya melakukan ini?

Apakah itu menggunakan beberapa kontrol khusus char untuk 'memalsukan' baris baru? Atau apakah ia tahu kapan outputnya sedang disalurkan ke perintah lain, dan format outputnya berbeda dalam kasus ini?

Chris B
sumber

Jawaban:

24

Atau apakah ia tahu kapan outputnya sedang disalurkan ke perintah lain, dan format outputnya berbeda dalam kasus ini?

Iya. Dari manual lengkap (tersedia hingga info lsdokumentasi terinstal):

Jika output standar adalah terminal, output dalam kolom (diurutkan secara vertikal) dan karakter kontrol adalah output sebagai tanda tanya; jika tidak, output terdaftar satu per baris dan karakter kontrol adalah output apa adanya.

Jika Anda menyukai output satu kolom, Anda dapat menjalankan

ls -1

untuk mendapatkannya di terminal juga.

Daniel Andersson
sumber
7
Secara khusus, fungsi lsdigunakan untuk menentukan apakah output terminal atau tidak isatty(3).
Blrfl
Juga agak terkait, jika seseorang ingin menguji ini dalam skrip shell sederhana seseorang dapat menjalankan tty -sdan memeriksa status pengembaliannya.
Daniel Andersson
10

lsmendeteksinya ketika Anda menyalurkan outputnya. Anda dapat melihatnya di dokumentasi:

Jika output standar adalah terminal, output dalam kolom (diurutkan secara vertikal) dan karakter kontrol adalah output sebagai tanda tanya; jika tidak, output terdaftar satu per baris dan karakter kontrol adalah output apa adanya.

Jika Anda ingin setiap file dalam output ditempatkan pada baris terpisah terlepas dari pengalihan pipa, Anda dapat menggunakan

ls -1
MilanorTSW
sumber