Hubungan Antara ls
dandir
ls
dan dir
merupakan program terpisah yang berperilaku sama. Seperti dijelaskan dan direferensikan di bawah, tujuan dari dir
adalah untuk memberikan perintah seperti ls
yang outputnya tidak bervariasi tergantung pada apakah itu akan ke terminal atau tidak . Untuk mencapai ini sangat membantu, dir
harus 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
dir
itu alias ls
, tetapi bukan itu masalahnya. Tidak ada perintah yang merupakan alias dari yang lain, dan secara default di Ubuntu, dir
bukan alias sama sekali. ls
dan dir
disediakan oleh executable yang terpisah dan tidak identik.
- Banyak orang percaya
dir
ada karena alasan historis yang tidak jelas atau untuk memberikan kompatibilitas dengan beberapa standar atau OS lainnya. Bukan itu masalahnya. ls
berperilaku 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 ls
dan dir
berbeda?
Keduanya ls
dan dir
daftar isi direktori. Dua perbedaan spesifik dalam perilaku default mereka membedakan mereka.
Ketika output standarnya adalah terminal, ls
daftar nama file dalam kolom yang diurutkan secara vertikal (seperti ls -C
). Ketika output standarnya bukan terminal (misalnya, file atau pipa ), ls
daftarkan nama file satu per baris (seperti ls -1
).
Apakah output standarnya adalah terminal atau tidak, dir
daftar nama file dalam kolom yang diurutkan secara vertikal (seperti ls -C
).
Untuk kedua ls
dan dir
, default ini dapat diganti dengan --format=
bendera dan oleh -1
, -C
, -m
, dan -x
bendera, yang menyingkat tertentu --format=
pilihan. Lihat 10.1.4 Pemformatan keluaran umum dalam manual referensi GNU coreutils untuk perinciannya.
Ketika output standarnya adalah terminal dan nama file yang akan dicantumkan berisi karakter kontrol , ls
cetak ?
alih-alih setiap karakter kontrol (seperti ls -q
). Ketika output standarnya bukan terminal, ls
mencetak karakter kontrol apa adanya (seperti ls --show-control-chars
).
Apakah output standarnya adalah terminal, ketika dir
bertemu 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, dir
akan mencantumkan entri yang disebut Documents backups
sebagai Documents\ backups
. Ini seperti ls -b
.
Untuk keduanya ls
dan 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 dir
utilitas 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 ls
atau sh
tidak 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 dir
program seperti halnya
ls
kecuali 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 ls
tidak dapat ditulis secara wajar untuk berperilaku perangkat secara mandiri, dir
utilitas terpisah dibuat untuk mencapai ini. Dengan demikian dir
bukan utilitas yang berperilaku aneh karena alasan kompatibilitas historis - ls
adalah .
Untuk melihat bagaimana ls
, dir
dan terkait vdir
utilitas 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 dir
bermanfaat?
Jika Anda pernah ingin ls
menghasilkan output multi-kolom bahkan ketika Anda memipangnya ke less
( ls | less
) atau mengarahkannya ke file ( ls > out.txt
), Anda dapat menggunakan dir
atau ls -C
.
Jika Anda pernah berharap Anda bisa langsung menyalin nama file yang ditunjukkan oleh ls
dan menggunakannya sebagai bagian dari perintah tanpa khawatir tentang penawaran , Anda dapat menggunakan dir
atau ls -b
.
dir
setara dengan ls -Cb
, jadi dalam pengertian itu Anda tidak perlu dir
. Tetapi dir
memberikan 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 ls
menjalankan ls --color=auto
. Ketika ls
ada baik sebagai alias maupun perintah eksternal, alias didahulukan dalam perintah interaktif sederhana.
Definisi alias tidak diperluas secara rekursif - itu adalah ls
perintah eksternal yang ls
dipanggil oleh alias --color=auto
. Lihat 6.6 Alias di manual referensi Bash untuk informasi lebih lanjut tentang cara kerja alias.
Ketika diteruskan ke ls
,, dir
atau vdir
(dan beberapa perintah lain, seperti grep
), --color=auto
menggunakan 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 ls
alias ( alias ls='ls --color=auto'
) tidak dihapus, sementara itu untuk dir
dan vdir
dikomentari #
sehingga mereka tidak berpengaruh. Artinya, sementara dir
bukan alias, ls
adalah (tetapi tidak untuk dir
) .
Bagaimana cara membuat dir
hasil berwarna?
Untuk mengaktifkan keluaran berwarna dir
, cukup edit .bashrc
di direktori home Anda dan batalkan komentar pada #alias dir='dir --color=auto'
baris dengan menghapus yang memimpin #
. Dalam cangkang dimulai setelah perubahan, dir
akan menjadi alias.
Jika Anda menginginkan perubahan di shell saat ini, Anda dapat menjalankan definisi alias sebagai perintah, atau Anda dapat sumber .bashrc
dengan 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
dir
alias ini , Anda tentu harus melakukannya.
- Ketika dipanggil sebagai perintah eksternal, misalnya dalam skrip atau jika Anda mengganti alias dengan menjalankan
\dir
atau command dir
, dir
masih akan menghasilkan output yang bebas perangkat. Hal ini untuk mengatakan bahwa aliasing dir
untuk dir --color=auto
tidak benar-benar istirahat dir
.
dir --color
;)