Perbedaan antara perintah terminal 'dir' dan 'ls'?


74

Saya sudah mencoba untuk menemukan perbedaan antara menggunakan perintah dirdan lsdi terminal. Saya tahu ls adalah metode UNIX tradisional untuk melihat file dalam direktori, dan itu diradalah setara dengan command prompt windows, tetapi kedua perintah bekerja di terminal.

Jika saya mengetiknya dirakan menampilkan file dan folder di direktori, dan jika saya mengetiknya lsmelakukan hal yang sama, kecuali dengan penyorotan konten. Kedua perintah menerima opsi (yaitu ls -adan dir -amengembalikan semua file dan folder serta file tersembunyi.

Jadi tidak ada yang tahu apa perbedaan dan mengapa kedua dirdan lsdigunakan?


7
dir --color;)
Rinzwind

3
Saya hanya ingin mengatakan bahwa saya terkejut dengan banyaknya jawaban yang diterima pertanyaan ini. Saya kira saya bukan satu-satunya yang bertanya-tanya tentang hal ini :)
BretD

3
Perintah dari zaman kuno selalu menyeret kutu buku yang lebih tua keluar dari kayu;)
Rinzwind

Jawaban:


70

dirdan lsmerupakan bagian dari coreutilsdan dirhampir sama dengan ls, hanya dengan opsi default yang berbeda.

GNU Core Utilities adalah utilitas dasar file, shell dan manipulasi teks dari sistem operasi GNU. Ini adalah utilitas inti yang diharapkan ada pada setiap sistem operasi.

info dir mengatakan:

dirsetara dengan ls -C -b; yaitu, secara default file terdaftar dalam kolom, diurutkan secara vertikal, dan karakter khusus diwakili oleh urutan escape backslash.

Oh dan ada juga vdir! info vdirmengatakan:

vdirsetara dengan ls -l -b; yaitu, secara default file terdaftar dalam format panjang dan karakter khusus diwakili oleh urutan escape backslash.

Kemungkinan besar dirada untuk kompatibilitas ke belakang atau karena alasan historis.


Saya berpikir bahwa itu mungkin hanya alias yang lain. Saya berasumsi alasannya adalah untuk membuat pengguna windows merasa lebih di rumah lol Terima kasih atas jawaban yang menyeluruh!
BretD

4
ketik alias diruntuk melihat apa itu sebenarnya. ketik aliasuntuk melihat semua alias.
user606723

2
@ user606723, 'alias dir' tidak muncul di 11.10 (setidaknya tidak untuk saya). Saya percaya 'alias' hanya menampilkan pengaturan alias pengguna lokal, bukan sistem luas.
James

ketik type diruntuk melihat apa itu (alias, perintah, fungsi bash ...)
ychaouche

49

Hubungan Antara lsdandir

lsdan dirmerupakan program terpisah yang berperilaku sama. Seperti dijelaskan dan direferensikan di bawah, tujuan dari diradalah untuk memberikan perintah seperti lsyang outputnya tidak bervariasi tergantung pada apakah itu akan ke terminal atau tidak . Untuk mencapai ini sangat membantu, dirharus memformat outputnya dengan cara yang masuk akal dan berguna baik untuk dilihat di terminal maupun untuk menulis ke file atau pipa.

Ada dua kesalahpahaman umum tentang dir:

  • Banyak orang percaya diritu alias ls, tetapi bukan itu masalahnya. Tidak ada perintah yang merupakan alias dari yang lain, dan secara default di Ubuntu, dirbukan alias sama sekali. lsdan dirdisediakan oleh executable yang terpisah dan tidak identik.
  • Banyak orang percaya dirada karena alasan historis yang tidak jelas atau untuk memberikan kompatibilitas dengan beberapa standar atau OS lainnya. Bukan itu masalahnya. lsberperilaku seperti itu untuk kompatibilitas. dir, yang tidak harus kompatibel karena itu bukan perintah Unix standar, berperilaku dengan cara alternatif yang dianggap berharga oleh pengembang sendiri dan bahkan mungkin lebih disukai.

OK, tapi bagaimana persisnya lsdan dirberbeda?

Keduanya lsdan dirdaftar isi direktori. Dua perbedaan spesifik dalam perilaku default mereka membedakan mereka.

  1. Ketika output standarnya adalah terminal, lsdaftar nama file dalam kolom yang diurutkan secara vertikal (seperti ls -C). Ketika output standarnya bukan terminal (misalnya, file atau pipa ), lsdaftarkan nama file satu per baris (seperti ls -1).

    Apakah output standarnya adalah terminal atau tidak, dirdaftar nama file dalam kolom yang diurutkan secara vertikal (seperti ls -C).

    Untuk kedua lsdan dir, default ini dapat diganti dengan --format=bendera dan oleh -1, -C, -m, dan -xbendera, yang menyingkat tertentu --format=pilihan. Lihat 10.1.4 Pemformatan keluaran umum dalam manual referensi GNU coreutils untuk perinciannya.

  2. Ketika output standarnya adalah terminal dan nama file yang akan dicantumkan berisi karakter kontrol , lscetak ?alih-alih setiap karakter kontrol (seperti ls -q). Ketika output standarnya bukan terminal, lsmencetak karakter kontrol apa adanya (seperti ls --show-control-chars).

    Apakah output standarnya adalah terminal, ketika dirbertemu dengan karakter kontrol atau karakter lain yang akan ditafsirkan secara khusus jika dimasukkan ke dalam shell, ia mencetak urutan garis miring terbalik untuk karakter. Ini termasuk bahkan karakter yang relatif umum seperti spasi. Misalnya, dirakan mencantumkan entri yang disebut Documents backupssebagai Documents\ backups. Ini seperti ls -b.

    Untuk keduanya lsdan dir, default-default ini mungkin ditimpa oleh flag-flag yang tercantum dalam 10.1.7 Memformat nama file dalam manual referensi GNU coreutils . Ini termasuk -b, -q, --quoting-style=, dan beberapa orang lain.

Sumber : ls invokasi dan dir invokasi , dalam manual referensi GNU coreutils .

Mengapa harus dir?

Dasar pemikiran untuk dirutilitas terpisah diberikan dalam 4,5 Standar untuk Antarmuka Umumnya dari standar pengkodean GNU . Saya sarankan membaca seluruh bagian itu untuk memahami alasan pengembang, tetapi berikut adalah hal-hal penting yang berlaku untuk ls/ dir:

Tolong jangan membuat perilaku utilitas tergantung pada nama yang digunakan untuk memintanya ....

Sebaliknya, gunakan opsi run time atau switch kompilasi atau keduanya untuk memilih di antara perilaku alternatif ....

Demikian juga, tolong jangan membuat perilaku program baris perintah tergantung pada jenis perangkat output ....

Kompatibilitas membutuhkan program tertentu untuk bergantung pada jenis perangkat output. Akan menjadi bencana jika lsatau shtidak melakukannya dengan cara yang diharapkan semua pengguna. Dalam beberapa kasus ini, kami melengkapi program dengan versi alternatif pilihan yang tidak bergantung pada jenis perangkat output. Sebagai contoh, kami menyediakan dirprogram seperti halnya lskecuali bahwa format output standarnya selalu format multi-kolom.

Proyek GNU menganggapnya tidak diinginkan, dari perspektif teknis, untuk utilitas untuk menghasilkan output yang berbeda tergantung pada jenis perangkat yang ditulisnya (setidaknya dalam konfigurasi default utilitas). Untuk beberapa utilitas, termasuk ls, output yang bergantung pada perangkat diperlukan untuk kompatibilitas dan berfungsi seperti yang diharapkan pengguna. Beberapa pengguna juga lebih suka perilaku bergantung pada perangkat ini.

Meskipun lstidak dapat ditulis secara wajar untuk berperilaku perangkat secara mandiri, dirutilitas terpisah dibuat untuk mencapai ini. Dengan demikian dirbukan utilitas yang berperilaku aneh karena alasan kompatibilitas historis - lsadalah .

Untuk melihat bagaimana ls, dirdan terkait vdirutilitas diimplementasikan dalam kode coreutils sumber tanpa duplikasi kode perlu, lihat ls-dir.c, ls-ls.c, ls-vdir.c, ls.h, dan ls.c.

Benarkah dirbermanfaat?

Jika Anda pernah ingin lsmenghasilkan output multi-kolom bahkan ketika Anda memipangnya ke less( ls | less) atau mengarahkannya ke file ( ls > out.txt), Anda dapat menggunakan diratau ls -C.

Jika Anda pernah berharap Anda bisa langsung menyalin nama file yang ditunjukkan oleh lsdan menggunakannya sebagai bagian dari perintah tanpa khawatir tentang penawaran , Anda dapat menggunakan diratau ls -b.

dirsetara dengan ls -Cb, jadi dalam pengertian itu Anda tidak perlu dir. Tetapi dirmemberikan kombinasi opsi yang dalam praktiknya sering berguna (meskipun tidak banyak diketahui).

Mengapa saya mendapatkan keluaran berwarna dari ls(datar ls -Cb) tetapi tidak dir?!

Sebagian besar pengguna Ubuntu memiliki alias yang disebut lsmenjalankan ls --color=auto. Ketika lsada baik sebagai alias maupun perintah eksternal, alias didahulukan dalam perintah interaktif sederhana.

Definisi alias tidak diperluas secara rekursif - itu adalah lsperintah eksternal yang lsdipanggil oleh alias --color=auto. Lihat 6.6 Alias di manual referensi Bash untuk informasi lebih lanjut tentang cara kerja alias.

Ketika diteruskan ke ls,, diratau vdir(dan beberapa perintah lain, seperti grep), --color=automenggunakan warna ketika outputnya adalah terminal, tetapi tidak sebaliknya.

Secara default di Ubuntu, akun pengguna dibuat dengan ini di ~/.bashrc:

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

Anda akan melihat lsalias ( alias ls='ls --color=auto') tidak dihapus, sementara itu untuk dirdan vdirdikomentari #sehingga mereka tidak berpengaruh. Artinya, sementara dirbukan alias, lsadalah (tetapi tidak untuk dir) .

Bagaimana cara membuat dirhasil berwarna?

Untuk mengaktifkan keluaran berwarna dir, cukup edit .bashrcdi direktori home Anda dan batalkan komentar pada #alias dir='dir --color=auto'baris dengan menghapus yang memimpin #. Dalam cangkang dimulai setelah perubahan, dirakan menjadi alias.

Jika Anda menginginkan perubahan di shell saat ini, Anda dapat menjalankan definisi alias sebagai perintah, atau Anda dapat sumber .bashrcdengan menjalankan . ~/.bashrc.

Ini bisa dibilang bertentangan dengan poin utama dir- bahwa itu harus menghasilkan jenis output yang sama terlepas dari perangkat output. Namun:

  • Jika Anda merasa berguna untuk membuat diralias ini , Anda tentu harus melakukannya.
  • Ketika dipanggil sebagai perintah eksternal, misalnya dalam skrip atau jika Anda mengganti alias dengan menjalankan \diratau command dir, dirmasih akan menghasilkan output yang bebas perangkat. Hal ini untuk mengatakan bahwa aliasing diruntuk dir --color=autotidak benar-benar istirahat dir.

Jawaban berkualitas, tetapi dapat menggunakan ToC atau TL; DR; :)
Kevin

5

Saya akan cenderung berpikir bahwa dirhanya ada kompatibilitas ke belakang .

Dari GNU Coreutils :

dir setara dengan ls -C -b; yaitu, secara default file terdaftar dalam kolom, diurutkan secara vertikal, dan karakter khusus diwakili oleh urutan escape backslash.

By the way, lstidak mewarnai output secara default: ini adalah karena kebanyakan distro alias lske ls --color=autodalam /etc/profile.d. Untuk tes, ketik unalias lslalu coba ls: tidak berwarna.

Sumber: Renan 's jawaban untuk Apa perbedaan antara ‘dir’ dan ‘ls’ ?


Meskipun dirini tidak disediakan untuk kompatibilitas mundur --dan lssebenarnya adalah --this jawabannya (dan jawaban itu mengutip dari) tidak benar menyatakan perbedaan teknis antara kedua perintah serta menjelaskan perbedaan pewarnaan umumnya diamati. Jadi +1.
Eliah Kagan

3

Jika ragu, bandingkan type lsvs type dir(lihat juga Perbedaan antara ls dan la ):

$ type dir
dir is aliased to `ls -l'

$ type ls
ls is aliased to `_ls'

$ type _ls
_ls is a function
_ls ()
{
    local IFS=' ';
    command ls $LS_OPTIONS ${1+"$@"}
}
$ echo command ls $LS_OPTIONS ${1+"$@"}
command ls -N --color=tty -T 0

Perbedaannya bermuara pada opsi yang berbeda untuk ls, dalam kasus saya --color=ttyakan menjadi yang paling terlihat, sistem Anda mungkin berbeda.


2
Ini tidak tampak seperti konfigurasi pengguna Ubuntu default sama sekali. Saya tidak berpikir salah satu sistem Ubuntu yang saya gunakan telah memiliki lssebagai alias untuk fungsi yang disebut _ls- bahkan sebagai baris komentar di .bashrc. Tampaknya seperti default untuk (setidaknya beberapa versi) openSuSE, meskipun, dilihat dari percakapan ini , file ini (ditautkan dari sana), dan memori saya (yang mungkin salah) saat saya terakhir menggunakan openSUSE.
Eliah Kagan

2
@EliahKagan: Anda dapat menebaknya, saya menggunakan OpenSuse! Jadi seperti yang saya katakan, hasilnya akan berbeda, tetapi metodenya harus baik-baik saja.
user2394284

2

Jawaban Singkat: Tidak ada, yang dirmerupakan kode sumber yang sama dari ls, lsbiner miliki --colorsecara default. (1 baris kode berbeda)


7
diradalah tidak alias ls. Mereka binari terpisah /usr/binyang berperilaku berbeda, seperti yang dijelaskan dalam Rinzwind 's jawaban . Anda bisa mencapai ini dengan alias, tetapi bukan itu yang dicapai. Terpisah dirdan lsbinari muncul di semua sistem yang menggunakan GNU Coreutils . Jika Anda perlu bukti, jalankan cmp /bin/ls /bin/dir.
Eliah Kagan

2
beberapa waktu lalu itu adalah alias dan Anda bisa melihatnya tercantum dalam daftar alias hanya dengan mengetik alias, sekarang biner baru dikompilasi untuk dir. Anda dapat men-download kode dengan: git clone git://git.sv.gnu.org/coreutils. Hanya satu baris kode berubah dalam ls-dir.c dan ini: int ls_mode = LS_MULTI_COL;. Secara teknis bukan alias, tetapi praktis itu adalah LS tetapi dengan opsi default yang berbeda (1 baris kode).
Francisco Valdez

1
Ya, dirini lsnamun dengan pilihan default yang berbeda . dirdan lsselalu menjadi binari terpisah dalam distribusi yang menggunakan GNU Coreutils. Beberapa distribusi mungkin, atau mungkin, juga mendefinisikan alias yang disebut dir(mendefinisikan alias yang nama yang sama dengan perintah yang ada cukup umum). Tetapi mereka adalah executable terpisah. Untuk membedakan antara alias shell (yang bukan file sama sekali) dan dieksekusi terpisah dengan kode sumber yang sama, bukan perbedaan yang mencolok. Mengatakan bahwa itu diradalah alias lsdi Ubuntu adalah salah dan menyesatkan .
Eliah Kagan

Ya, saya setuju dengan Anda, tetapi dalam hal ini, bukan kode sumber yang sama, adalah kode sumber yang sama. Jika kita mengatakan bahwa alias hanyalah apa saja yang terdaftar aliasmaka tentu saja bukan alias.
Francisco Valdez

3
Ini bukan kode sumber yang sama. Seperti yang Anda katakan, "satu baris sumber diubah." Dan jika itu sumber yang sama maka itu masih bukan alias. Ada banyak hal dalam sistem mirip Unix yang mirip dengan alias tetapi akan sangat membingungkan bagi para pemula (dan menjengkelkan bagi pengguna berpengalaman) untuk memanggil alias. Tautan simbolik, tautan keras, file identik, file serupa, skrip wrapper, shell builtins menyembunyikan executable, dan file yang disinkronkan (mis. Dengan UbuntuOne) semuanya mirip dengan alias dalam cara yang signifikan, tetapi itu bukan alias.
Eliah Kagan
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.