Mối quan hệ giữa ls
vàdir
ls
và dir
là các chương trình riêng biệt hoạt động tương tự. Như được giải thích và được tham chiếu dưới đây, mục đích của dir
việc cung cấp một lệnh giống như ls
đầu ra của chúng không thay đổi tùy thuộc vào việc nó có đi đến một thiết bị đầu cuối hay không . Để đạt được điều này một cách hữu ích, dir
phải định dạng đầu ra của nó theo cách hợp lý và hữu ích cả để xem trong thiết bị đầu cuối và để ghi vào tệp hoặc đường ống.
Có hai quan niệm sai lầm phổ biến về dir
:
- Nhiều người tin
dir
là bí danh ls
, nhưng đó không phải là trường hợp. Cả hai lệnh đều không phải là bí danh của người khác và theo mặc định trong Ubuntu, hoàn toàn dir
không phải là bí danh. ls
và dir
được cung cấp bởi các thực thi riêng biệt, không giống hệt nhau.
- Nhiều người tin rằng
dir
tồn tại vì lý do lịch sử tối nghĩa hoặc để cung cấp khả năng tương thích với một số hệ điều hành tiêu chuẩn hoặc một số hệ điều hành khác. Đó cũng không phải là trường hợp. ls
hành xử theo cách nó làm cho đồng bào. dir
, không cần phải tương thích vì nó không phải là một lệnh Unix tiêu chuẩn, hoạt động theo cách thay thế mà các nhà phát triển coi là có giá trị theo quyền riêng của mình và thậm chí có thể thích hợp hơn.
OK, nhưng chính xác làm thế nào ls
và dir
khác nhau?
Cả hai ls
và dir
liệt kê nội dung của các thư mục. Hai sự khác biệt cụ thể trong hành vi mặc định của chúng phân biệt chúng.
Khi đầu ra tiêu chuẩn của nó là một thiết bị đầu cuối, ls
liệt kê tên tệp trong các cột được sắp xếp theo chiều dọc (như ls -C
). Khi đầu ra tiêu chuẩn của nó không phải là một thiết bị đầu cuối (ví dụ: tệp hoặc đường ống ), ls
liệt kê tên tệp một trên mỗi dòng (như ls -1
).
Cho dù đầu ra tiêu chuẩn của nó có phải là một thiết bị đầu cuối hay không, hãy dir
liệt kê tên tệp trong các cột được sắp xếp theo chiều dọc (như ls -C
).
Đối với cả hai ls
và dir
, những giá trị mặc định có thể được ghi đè bởi các --format=
lá cờ và đến -1
, -C
, -m
, và -x
cờ, mà viết tắt đặc biệt --format=
lựa chọn. Xem 10.1.4 Định dạng đầu ra chung trong hướng dẫn tham khảo lõi GNU để biết chi tiết.
Khi đầu ra tiêu chuẩn của nó là một thiết bị đầu cuối và một tên tệp được liệt kê chứa các ký tự điều khiển , ls
in ?
thay vì mỗi ký tự điều khiển (như ls -q
). Khi đầu ra tiêu chuẩn của nó không phải là một thiết bị đầu cuối, ls
in các ký tự điều khiển nguyên trạng (như ls --show-control-chars
).
Cho dù đầu ra tiêu chuẩn của nó có phải là một thiết bị đầu cuối hay không, khi dir
gặp một ký tự điều khiển hoặc bất kỳ ký tự nào khác sẽ được giải thích đặc biệt nếu được nhập vào một vỏ, nó sẽ in các chuỗi dấu gạch chéo ngược cho các ký tự. Điều này bao gồm các nhân vật thậm chí tương đối phổ biến như không gian. Ví dụ, dir
sẽ liệt kê một mục được gọi Documents backups
là Documents\ backups
. Đây là như thế ls -b
.
Đối với cả hai ls
và dir
, các giá trị mặc định này có thể bị ghi đè bởi các cờ được liệt kê trong 10.1.7 Định dạng tên tệp trong hướng dẫn tham chiếu lõi của GNU . Điều này bao gồm -b
, -q
, --quoting-style=
, và một số người khác.
Nguồn : ls invocation và dir invocation , trong tài liệu tham khảo GNU coreutils .
Tại sao có dir
?
Cơ sở lý luận cho một dir
tiện ích riêng biệt được đưa ra trong 4.5 Tiêu chuẩn cho giao diện Nói chung về các tiêu chuẩn mã hóa GNU . Tôi khuyên bạn nên đọc toàn bộ phần đó để hiểu lý do của các nhà phát triển, nhưng đây là những điểm nổi bật khi áp dụng cho ls
/ dir
:
Vui lòng không thực hiện hành vi của một tiện ích phụ thuộc vào tên được sử dụng để gọi nó ....
Thay vào đó, sử dụng tùy chọn thời gian chạy hoặc công tắc biên dịch hoặc cả hai để chọn trong số các hành vi thay thế ....
Tương tự, vui lòng không thực hiện hành vi của chương trình dòng lệnh phụ thuộc vào loại thiết bị đầu ra ....
Khả năng tương thích đòi hỏi các chương trình nhất định phụ thuộc vào loại thiết bị đầu ra. Sẽ là thảm họa nếu ls
hoặc sh
không làm như vậy theo cách mà tất cả người dùng mong đợi. Trong một số trường hợp này, chúng tôi bổ sung cho chương trình một phiên bản thay thế ưa thích không phụ thuộc vào loại thiết bị đầu ra. Ví dụ: chúng tôi cung cấp một dir
chương trình giống như
ls
ngoại trừ định dạng đầu ra mặc định của nó luôn là định dạng nhiều cột.
Dự án GNU coi điều đó là không mong muốn, từ góc độ kỹ thuật, để một tiện ích tạo ra đầu ra khác nhau tùy thuộc vào loại thiết bị mà nó đang viết (ít nhất là trong cấu hình mặc định của tiện ích). Đối với một số tiện ích, bao gồm ls
, đầu ra phụ thuộc vào thiết bị là cần thiết để tương thích và do đó, nó hoạt động theo cách người dùng mong đợi. Một số người dùng cũng đặc biệt thích hành vi phụ thuộc vào thiết bị này.
Mặc dù ls
không thể được viết một cách hợp lý để hoạt động độc lập với thiết bị, một dir
tiện ích riêng biệt đã được tạo ra để đạt được điều này. Do đó, dir
không phải là tiện ích hành xử kỳ lạ vì lý do tương thích lịch sử-- ls
là .
Để xem cách ls
, dir
và có liên quan vdir
tiện ích được thực hiện trong mã nguồn coreutils mà không trùng lắp mã không cần thiết, xem ls-dir.c
, ls-ls.c
, ls-vdir.c
, ls.h
, và ls.c
.
Có dir
thực sự hữu ích?
Nếu bạn đã từng muốn ls
tạo đầu ra nhiều cột ngay cả khi bạn chuyển nó sang less
( ls | less
) hoặc chuyển hướng nó đến một tệp ( ls > out.txt
), bạn có thể sử dụng dir
hoặc ls -C
.
Nếu bạn từng mong muốn, bạn có thể sao chép trực tiếp tên tệp được hiển thị bởi ls
và sử dụng nó như một phần của lệnh mà không phải lo lắng về việc trích dẫn , bạn có thể sử dụng dir
hoặc ls -b
.
dir
tương đương với ls -Cb
, vì vậy theo nghĩa đó bạn không cần dir
. Nhưng dir
cung cấp một sự kết hợp của các tùy chọn mà trong thực tế thường hữu ích (mặc dù không được biết đến rộng rãi).
Tại sao tôi nhận được đầu ra màu từ ls
(chẵn ls -Cb
) mà không dir
?!
Hầu hết người dùng Ubuntu có một bí danh được gọi là ls
chạy ls --color=auto
. Khi ls
tồn tại cả dưới dạng bí danh và lệnh bên ngoài, bí danh được ưu tiên trong các lệnh tương tác đơn giản.
Các định nghĩa bí danh không được mở rộng đệ quy - đó là ls
lệnh bên ngoài mà ls
bí danh đang gọi --color=auto
. Xem 6.6 Bí danh trong hướng dẫn tham khảo Bash để biết thêm thông tin về cách hoạt động của bí danh.
Khi được truyền tới ls
, dir
hoặc vdir
(và một số lệnh khác, như grep
), --color=auto
sử dụng màu khi đầu ra của nó là một thiết bị đầu cuối, nhưng không phải là khác.
Theo mặc định trong Ubuntu, tài khoản người dùng được tạo bằng ~/.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
Bạn sẽ nhận thấy ls
bí danh ( alias ls='ls --color=auto'
) không bị thiếu, trong khi những người cho dir
và vdir
được nhận xét #
để chúng không có hiệu lực. Đó là, trong khi dir
không phải là bí danh, ls
là (nhưng không phải dir
) .
Làm thế nào để tôi thực hiện dir
sản xuất màu, quá?
Để bật đầu ra màu dir
, chỉ cần chỉnh sửa .bashrc
trong thư mục chính của bạn và bỏ #alias dir='dir --color=auto'
dòng bằng cách xóa hàng đầu #
. Trong vỏ bắt đầu sau khi thay đổi, dir
sẽ là một bí danh.
Nếu bạn muốn thay đổi trong trình bao hiện tại, bạn có thể chạy định nghĩa bí danh dưới dạng lệnh hoặc bạn có thể nguồn .bashrc
bằng cách chạy . ~/.bashrc
.
Điều này được cho là đi ngược lại với điểm chính của dir
- vì vậy nó sẽ tạo ra cùng một loại đầu ra bất kể thiết bị đầu ra. Tuy nhiên:
- Nếu bạn thấy hữu ích để tạo
dir
bí danh này , bạn chắc chắn nên làm như vậy.
- Khi được gọi là một lệnh bên ngoài, ví dụ như trong các tập lệnh hoặc nếu bạn ghi đè bí danh bằng cách chạy
\dir
hoặc command dir
, dir
vẫn sẽ tạo ra đầu ra độc lập với thiết bị. Điều này là để nói răng cưa mà dir
để dir --color=auto
không thực sự phá vỡ dir
.
dir --color
;)