Mối quan hệ giữa lsvàdir
lsvà dirlà 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 dirviệ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, dirphả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
dirlà 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 dirkhông phải là bí danh. lsvà 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
dirtồ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. lshà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 lsvà dirkhác nhau?
Cả hai lsvà dirliệ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, lsliệ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 ), lsliệ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 dirliệ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 lsvà 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à -xcờ, 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 , lsin ?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, lsin 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 dirgặ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ụ, dirsẽ liệt kê một mục được gọi Documents backupslà Documents\ backups. Đây là như thế ls -b.
Đối với cả hai lsvà 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 dirtiệ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 lshoặc shkhô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 dirchương trình giống như
lsngoạ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ù lskhô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 dirtiện ích riêng biệt đã được tạo ra để đạt được điều này. Do đó, dirkhông phải là tiện ích hành xử kỳ lạ vì lý do tương thích lịch sử-- lslà .
Để xem cách ls, dirvà có liên quan vdirtiệ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ó dirthực sự hữu ích?
Nếu bạn đã từng muốn lstạ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 dirhoặ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 lsvà 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 dirhoặc ls -b.
dirtương đương với ls -Cb, vì vậy theo nghĩa đó bạn không cần dir. Nhưng dircung 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à lschạy ls --color=auto. Khi lstồ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à lslệnh bên ngoài mà lsbí 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, dirhoặc vdir(và một số lệnh khác, như grep), --color=autosử 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 lsbí danh ( alias ls='ls --color=auto') không bị thiếu, trong khi những người cho dirvà vdirđược nhận xét #để chúng không có hiệu lực. Đó là, trong khi dirkhông phải là bí danh, lslà (nhưng không phải dir) .
Làm thế nào để tôi thực hiện dirsản xuất màu, quá?
Để bật đầu ra màu dir, chỉ cần chỉnh sửa .bashrctrong 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, dirsẽ 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 .bashrcbằ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
dirbí 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
\dirhoặc command dir, dirvẫ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=autokhông thực sự phá vỡ dir.
dir --color;)