Sự khác nhau giữa các lệnh đầu cuối 'dir' và 'ls'?


74

Tôi đã cố gắng tìm sự khác biệt giữa việc sử dụng các lệnh dirlstrong thiết bị đầu cuối. Tôi biết ls là phương pháp UNIX truyền thống để xem các tệp trong một thư mục và đó dirlà dấu nhắc lệnh windows tương đương, nhưng cả hai lệnh đều hoạt động trong terminal.

Nếu tôi gõ, dirnó sẽ hiển thị các tệp và thư mục trong thư mục và nếu tôi nhập lsthì nó cũng tương tự, ngoại trừ việc tô sáng nội dung. Cả hai lệnh đều chấp nhận các tùy chọn (nghĩa là ls -adir -acả hai trả về tất cả các tệp và thư mục và các tệp ẩn.

Vậy có ai biết sự khác biệt là gì và tại sao cả hai dirlsđược sử dụng?


7
dir --color;)
Rinzwind

3
chỉ muốn nói rằng tôi ngạc nhiên về số lượng câu trả lời mà câu hỏi này đã nhận được. Tôi đoán tôi không phải là người duy nhất tự hỏi về điều này :)
BretD

3
Các lệnh từ thời cổ đại luôn kéo các
mọt

Câu trả lời:


70

dirlslà một phần của coreutilsdirgần giống như ls, chỉ với các tùy chọn mặc định khác nhau.

GNU Core Utility là các tiện ích thao tác tệp, vỏ và văn bản cơ bản của hệ điều hành GNU. Đây là những tiện ích cốt lõi dự kiến ​​sẽ tồn tại trên mọi hệ điều hành.

info dir nói:

dirtương đương với ls -C -b; nghĩa là, theo mặc định, các tệp được liệt kê trong các cột, được sắp xếp theo chiều dọc và các ký tự đặc biệt được thể hiện bằng các chuỗi thoát dấu gạch chéo ngược.

Ồ và cũng có vdir! info vdirnói:

vdirtương đương với ls -l -b; nghĩa là, theo mặc định, các tệp được liệt kê ở định dạng dài và các ký tự đặc biệt được thể hiện bằng các chuỗi thoát dấu gạch chéo ngược.

Nhiều khả năng dirtồn tại cho khả năng tương thích ngược hoặc vì lý do lịch sử.


Tôi đã nghĩ rằng nó có lẽ chỉ là bí danh của người khác. Tôi cho rằng lý do là để làm cho người dùng windows cảm thấy thoải mái hơn ở nhà lol Cảm ơn bạn đã trả lời thấu đáo!
BretD

4
alias dirđể xem nó thực sự là gì. gõ aliasđể xem tất cả các bí danh.
dùng606723

2
@ user606723, 'bí danh dir' không hiển thị trong 11.10 (ít nhất là không dành cho tôi). Tôi tin rằng 'bí danh' chỉ hiển thị cài đặt bí danh người dùng cục bộ, không phải toàn hệ thống.
James

type dirđể xem nó là gì (bí danh, lệnh, hàm bash ...)
ychaouche

49

Mối quan hệ giữa lsdir

lsdirlà 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. lsdirđượ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 lsdirkhác nhau?

Cả hai lsdirliệ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.

  1. 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 lsdir, 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.

  2. 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 backupsDocuments\ backups. Đây là như thế ls -b.

    Đối với cả hai lsdir, 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 invocationdir 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ử-- ls .

Để 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.

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 dirvdirđược nhận xét #để chúng không có hiệu lực. Đó là, trong khi dirkhông phải là bí danh, ls (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.

Câu trả lời chất lượng, nhưng có thể sử dụng ToC hoặc TL; DR; :)
Kevin

5

Tôi sẽ có khuynh hướng nghĩ rằng đó dirlà chỉ để tương thích ngược .

Từ GNU Coreutils :

dir tương đương với ls -C -b; nghĩa là, theo mặc định, các tệp được liệt kê trong các cột, được sắp xếp theo chiều dọc và các ký tự đặc biệt được thể hiện bằng các chuỗi thoát dấu gạch chéo ngược.

Bằng cách này, lskhông tô màu cho quả đầu ra theo mặc định: đây là bởi vì hầu hết các distro alias lsđể ls --color=auto/etc/profile.d. Đối với một bài kiểm tra, gõ unalias lsrồi thử ls: nó sẽ không màu.

Nguồn: Renan 's câu trả lời cho sự khác biệt giữa ‘dir’ và ‘ls’ là gì ?


Mặc dù dirkhông được cung cấp để tương thích ngược --và phải lsthực sự câu trả lời --this (và câu trả lời nó trích dẫn từ) không nêu chính xác sự khác biệt kỹ thuật giữa hai lệnh cũng như giải thích sự khác biệt colorization thường quan sát. Vậy +1.
Eliah Kagan

3

Khi nghi ngờ, hãy so sánh type lsvs type dir(xem thêm Sự khác biệt giữa ls và 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

Sự khác biệt tập trung vào các tùy chọn khác nhau ls, trong trường hợp của tôi --color=ttysẽ là rõ ràng nhất, hệ thống của bạn có thể khác nhau.


2
Đây hoàn toàn không giống cấu hình người dùng Ubuntu. Tôi không nghĩ rằng bất kỳ hệ thống Ubuntu nào tôi đã sử dụng đều có lsbí danh cho một chức năng được gọi _ls- thậm chí không phải là một dòng nhận xét .bashrc. Dường như nó mặc định cho (ít nhất là một số phiên bản) openSuSE, mặc dù, đánh giá qua cuộc trò chuyện này , tệp này (được liên kết từ đó) và bộ nhớ (có lẽ là sai) của tôi khi tôi sử dụng openSUSE lần cuối.
Eliah Kagan

2
@EliahKagan: Bạn đoán vậy, tôi đang sử dụng OpenSuse! Vì vậy, như tôi đã nói, kết quả sẽ khác nhau, nhưng phương pháp sẽ ổn.
dùng2394284

2

Trả lời ngắn: Không, dirlà cùng một mã nguồn hơn ls, lsnhị phân có --colortheo mặc định. (1 dòng mã khác nhau)


7
dirkhông bí danh của ls. Chúng là các nhị phân riêng biệt trong /usr/binđó hoạt động khác nhau, như được mô tả trong câu trả lời của Rinzwind . Bạn có thể đạt được điều này với bí danh, nhưng đó không phải là cách nó đạt được. Riêng biệt và nhị phân xuất hiện trên tất cả các hệ thống sử dụng GNU Coreutils . Nếu bạn cần bằng chứng, hãy chạy . dirlscmp /bin/ls /bin/dir
Eliah Kagan

2
một thời gian trước đây là một bí danh và bạn có thể thấy nó được liệt kê trong danh sách bí danh chỉ bằng cách gõ alias, bây giờ một nhị phân mới được biên dịch cho dir. Bạn có thể tải xuống mã của nó với : git clone git://git.sv.gnu.org/coreutils. Chỉ có một dòng mã được thay đổi trong ls-dir.c và đây là : int ls_mode = LS_MULTI_COL;. Về mặt kỹ thuật không phải là bí danh, nhưng thực tế nó là LS nhưng với các tùy chọn mặc định khác nhau (1 dòng mã).
Francisco Valdez

1
Vâng, dirlsnhưng với các tùy chọn mặc định khác nhau . dirlsluôn luôn là các nhị phân riêng biệt trong các bản phân phối sử dụng GNU Coreutils. Một số bản phân phối có thể, hoặc có thể, cũng đã định nghĩa một bí danh được gọi dir(xác định các bí danh có cùng tên với một lệnh hiện có là khá phổ biến). Nhưng chúng là các tệp thực thi riêng biệt. Để phân biệt giữa một bí danh shell (hoàn toàn không phải là một tệp) và một tệp thực thi riêng biệt với mã nguồn tương tự, không phải là một sự khác biệt về phạm vi. Thật sai lầm và sai lầm khi nói rằng đó dirlà bí danh của lsUbuntu.
Eliah Kagan

Vâng, tôi đồng ý với bạn, nhưng trong trường hợp này, không phải là mã nguồn tương tự, là cùng một mã nguồn. Nếu chúng ta nói rằng bí danh chỉ là bất cứ thứ gì được liệt kê aliasthì tất nhiên đó không phải là bí danh.
Francisco Valdez

3
Nó không phải là cùng một mã nguồn. Như bạn đã nói, "một dòng nguồn được thay đổi." Và nếu đó là cùng một nguồn thì nó vẫn không phải là bí danh. Có rất nhiều thứ trong một hệ thống giống Unix tương tự như bí danh nhưng sẽ gây nhầm lẫn lớn cho người mới (và bực tức với người dùng có kinh nghiệm) để gọi bí danh. Các liên kết tượng trưng, ​​liên kết cứng, các tệp giống hệt nhau, các tệp tương tự, các tập lệnh trình bao bọc, các hàm dựng sẵn ẩn các tệp thực thi và các tệp được đồng bộ hóa (ví dụ với UbuntuOne) đều tương tự như các bí danh theo những cách quan trọng, nhưng chúng không phải là bí danh.
Eliah Kagan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.