Różnica między poleceniami terminalu „dir” i „ls”?

74

Próbowałem znaleźć różnicę między używaniem poleceń diri lsw terminalu. Wiem, że ls jest tradycyjną metodą UNIXową przeglądania plików w katalogu, i dirjest to odpowiednik wiersza poleceń systemu Windows, ale oba polecenia działają w terminalu.

Jeśli piszę dir, wyświetla pliki i foldery w katalogu, a jeśli piszę ls, robi to samo, z wyjątkiem podświetlania zawartości. Oba polecenia akceptują opcje (tj. ls -aI dir -aoba zwracają wszystkie pliki i foldery oraz pliki ukryte.

Więc czy ktoś wie jaka jest różnica i dlaczego obie diri lssą wykorzystywane?

BretD
źródło
7
dir --color;)
Rinzwind
3
chciałem tylko powiedzieć, że jestem zaskoczony ilością odpowiedzi, jakie otrzymało to pytanie. Chyba nie byłem jedynym, który się nad tym zastanawiał :)
BretD
3
Komendy z czasów starożytnych zawsze wyciągają starszych kujonów z stolarki;)
Rinzwind

Odpowiedzi:

70

diri lssą częścią coreutilsi dirsą prawie takie same jak ls, tylko z różnymi opcjami domyślnymi.

Narzędzia GNU Core to podstawowe narzędzia do obsługi plików, powłok i tekstów w systemie operacyjnym GNU. Są to podstawowe narzędzia, które powinny istnieć w każdym systemie operacyjnym.

info dir mówi:

dirjest równoważne z ls -C -b; to znaczy, domyślnie pliki są wyświetlane w kolumnach, posortowane pionowo, a znaki specjalne są reprezentowane przez sekwencje specjalne odwrotnego ukośnika.

Aha i jest też vdir! info vdirmówi:

vdirjest równoważne z ls -l -b; to znaczy, domyślnie pliki są wyświetlane w długim formacie, a znaki specjalne są reprezentowane przez sekwencje specjalne odwrotnego ukośnika.

Najprawdopodobniej diristnieje ze względu na kompatybilność wsteczną lub z powodów historycznych.

Rinzwind
źródło
Myślałem, że to prawdopodobnie tylko pseudonim tego drugiego. Przyjąłem, że powodem było sprawienie, aby użytkownicy systemu Windows poczuli się bardziej jak w domu.
BretD
4
wpisz, alias diraby zobaczyć, co to właściwie jest. wpisz, aliasaby zobaczyć wszystkie aliasy.
user606723,
2
@ user606723, „alias dir” nie pojawia się w 11.10 (przynajmniej nie dla mnie). Uważam, że „alias” pokazuje tylko lokalne ustawienia aliasu użytkownika, a nie cały system.
James
wpisz, type diraby zobaczyć, co to jest (alias, polecenie, funkcja bash ...)
ychaouche
49

Związek między lsidir

lsi dirsą osobnymi programami, które zachowują się podobnie. Jak wyjaśniono i przywołano poniżej, celem dirjest dostarczenie polecenia, lsktórego wynik nie zmienia się w zależności od tego, czy trafi on do terminala . Aby osiągnąć ten cel, dirnależy sformatować dane wyjściowe w sposób rozsądny i przydatny zarówno do wyświetlania w terminalu, jak i do zapisu do pliku lub potoku.

Istnieją dwa powszechne nieporozumienia na temat dir:

  • Wiele osób uważa, że dirjest to pseudonim ls, ale tak nie jest. Żadne z poleceń nie jest aliasem drugiego i domyślnie w Ubuntu dirwcale nie jest aliasem. lsi dirsą dostarczane przez oddzielne, nieidentyczne pliki wykonywalne.
  • Wiele osób uważa dir, że istnieje z niejasnych powodów historycznych lub w celu zapewnienia zgodności z niektórymi standardowymi lub innymi systemami operacyjnymi. Tak też nie jest. lszachowuje się tak, jak w przypadku kompatybilności. dir, który nie musi być zgodny, ponieważ nie jest to standardowe polecenie uniksowe, zachowuje się w alternatywny sposób, który programiści uważają za wartościowy sam w sobie, a być może nawet preferowany.

OK, ale dokładnie lsczym się dirróżnią i czym się różnią?

Zarówno lsi dirwyświetla zawartość katalogów. Wyróżniają je dwie szczególne różnice w ich domyślnych zachowaniach.

  1. Gdy jego standardowym wyjściem jest terminal, lswyświetla nazwy plików w pionowo posortowanych kolumnach (jak ls -C). Gdy jego standardowym wyjściem nie jest terminal (na przykład plik lub potok ), lswyświetla nazwy plików po jednym w wierszu (jak ls -1).

    Niezależnie od tego, czy jego standardowym wyjściem jest terminal, dirwyświetla nazwy plików w pionowo posortowanych kolumnach (jak ls -C).

    Dla obu ls, a dirte błędy mogą zostać zastąpione przez --format=flagę i przez -1, -C, -mi -xflagi, które skracać poszczególne --format=opcje. Szczegółowe informacje można znaleźć w 10.1.4 Ogólne formatowanie wyjściowe w podręczniku GNU coreutils .

  2. Gdy jego standardowym wyjściem jest terminal, a nazwa pliku, która ma zostać wymieniona, zawiera znaki sterujące , lsdrukuje ?zamiast każdego znaku sterującego (jak ls -q). Gdy jego standardowym wyjściem nie jest terminal, lswypisuje znaki kontrolne takimi, jakie są (jak ls --show-control-chars).

    Bez względu na to, czy jego standardowym wyjściem jest terminal, gdy dirnapotka znak kontrolny lub inny znak, który zostałby specjalnie zinterpretowany, jeśli zostanie wprowadzony do powłoki, drukuje sekwencje odwrotnego ukośnika dla tych znaków. Obejmuje to nawet stosunkowo popularne znaki, takie jak spacje. Na przykład dirwyświetli wpis o nazwie Documents backupsas Documents\ backups. To jest jak ls -b.

    Dla obu ls, a dirte błędy mogą zostać zastąpione przez flagi wymienionych w 10.1.7 Formatowanie nazw plików w tej coreutils GNU Reference Manual . Obejmuje to -b, -q, --quoting-style=, i kilka innych.

Źródła : wywołanie ls i dir , w podręczniku GNU coreutils .

Dlaczego dir?

Uzasadnieniem odrębnego dirnarzędzia podano w 4.5 Standardy interfejsów Generalnie ze standardów kodowania GNU . Polecam przeczytać całą sekcję, aby zrozumieć rozumowanie programistów, ale oto najważniejsze informacje dotyczące ls/ dir:

Proszę nie uzależniać zachowania narzędzia od nazwy użytej do jego wywołania ....

Zamiast tego użyj opcji czasu wykonywania lub przełącznika kompilacji albo obu, aby wybrać spośród alternatywnych zachowań ...

Podobnie, proszę nie uzależniać zachowania programu wiersza poleceń od typu urządzenia wyjściowego ....

Zgodność wymaga, aby niektóre programy zależały od typu urządzenia wyjściowego. To byłoby katastrofalne, jeśli lsalbo shnie robić tego w sposób wszyscy użytkownicy oczekują. W niektórych przypadkach uzupełniamy program o preferowaną alternatywną wersję, która nie zależy od typu urządzenia wyjściowego. Na przykład zapewniamy dirprogram podobny do lstego, że domyślnym formatem wyjściowym jest zawsze format wielokolumnowy.

Projekt GNU uważa za niepożądane, z technicznego punktu widzenia, aby narzędzie generowało różne dane wyjściowe w zależności od rodzaju urządzenia, do którego pisze (przynajmniej w domyślnej konfiguracji narzędzia). W przypadku niektórych narzędzi, w tym lszależne od urządzenia dane wyjściowe są niezbędne do zapewnienia zgodności, a więc działa tak, jak oczekują użytkownicy. Niektórzy użytkownicy szczególnie wolą takie zachowanie zależne od urządzenia.

Chociaż lsnie można było rozsądnie napisać, że zachowuje się niezależnie od urządzenia, stworzono osobne dirnarzędzie, aby to osiągnąć. Zatem dirnie jest to narzędzie, które zachowuje się dziwnie ze względu na historyczną zgodność - lsjest .

Aby zobaczyć, jak ls, diri związane vdirnarzędzie są zaimplementowane w kodzie źródłowym coreutils bez kodu niepotrzebnego powielania, zobacz ls-dir.c, ls-ls.c, ls-vdir.c, ls.h, i ls.c.

Czy to dirnaprawdę przydatne?

Jeśli kiedykolwiek chciałeś lswyprodukować wyjście wielokolumnowe, nawet gdy potokowałeś je do less( ls | less) lub przekierowałeś do pliku ( ls > out.txt), możesz użyć dirlub ls -C.

Jeśli kiedykolwiek chciałeś, aby bezpośrednio skopiować nazwę pliku pokazaną przez lsi używać jej jako części polecenia, nie martwiąc się o cytowanie , możesz użyć dirlub ls -b.

dirjest równoważne ls -Cb, więc w tym sensie nie potrzebujesz dir. Ale dirzapewnia kombinację opcji, które w praktyce są często przydatne (choć nie są powszechnie znane).

Dlaczego otrzymuję pokolorowane wyjście ls(nawet ls -Cb), ale nie dir?

Większość użytkowników Ubuntu ma alias o nazwie, lsktóry działa ls --color=auto. Gdy lsistnieje zarówno jako alias, jak i polecenie zewnętrzne, alias ma pierwszeństwo w prostych, interaktywnych poleceniach.

Definicje aliasów nie są rozszerzane rekurencyjnie - jest to zewnętrzne lspolecenie, za pomocą którego lsalias dzwoni --color=auto. Aby uzyskać więcej informacji na temat działania aliasów, zobacz 6.6 Aliasy w podręczniku użytkownika Bash .

Po przekazaniu do ls, dirlub vdir(i inne rozkazy, jak grep) --color=autowykorzystuje kolor, gdy jego wyjście jest terminal, ale nie inaczej.

Domyślnie w Ubuntu konta użytkowników są tworzone w następujący sposób ~/.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

Zauważysz, że lsalias ( alias ls='ls --color=auto') nie jest komentowany , a te za diri vdirsą komentowane, #więc nie działają. Oznacza to, że chociaż dirnie jest aliasem, lsjest (ale nie do dir) .

Jak mogę również dirprodukować kolorowe wydruki?

Aby włączyć kolorowe wydruki dir, po prostu edytuj .bashrcw swoim katalogu domowym i odkomentuj #alias dir='dir --color=auto'linię, usuwając wiodące #. W powłokach rozpoczętych po zmianie dirbędzie alias.

Jeśli chcesz zmiany w bieżącej powłoce, możesz uruchomić definicję aliasu jako komendę lub możesz .bashrcją uruchomić, uruchamiając . ~/.bashrc.

Jest to prawdopodobnie sprzeczne z głównym punktem dir- że powinien generować ten sam rodzaj wyjścia niezależnie od urządzenia wyjściowego. Jednak:

  • Jeśli uznasz, że użyteczne jest utworzenie tego diraliasu, powinieneś to zrobić.
  • Wywoływany jako polecenie zewnętrzne, na przykład w skryptach lub w przypadku zastąpienia aliasu przez uruchomienie \dirlub command dir, dirnadal będzie generować wynik niezależny od urządzenia. To znaczy, że aliasing dirdo dir --color=autotak naprawdę się nie psuje dir.
Eliah Kagan
źródło
Odpowiedź wysokiej jakości, ale można użyć ToC lub TL; DR; :)
Kevin
5

Byłbym skłonny myśleć, że dirjest to tylko dla kompatybilności wstecznej .

Z GNU Coreutils :

dir jest równoważne ls-C-b; to znaczy, domyślnie pliki są wyświetlane w kolumnach, posortowane pionowo, a znaki specjalne są reprezentowane przez sekwencje specjalne odwrotnego ukośnika.

Nawiasem mówiąc, lsnie kolorowania wyjście domyślnie: to dlatego, że większość dystrybucji alias lsdo ls --color=autow /etc/profile.d. Do testu wpisz, unalias lsa następnie spróbuj ls: będzie bezbarwny.

Źródło: Renan jest odpowiedzią na czym polega różnica między «dir» i «LS» ?

Zlatan
źródło
Chociaż niedir jest zapewniona kompatybilność wsteczna - a lstak naprawdę jest - ta odpowiedź (i odpowiedź, którą przytacza) poprawnie podaje różnicę techniczną między tymi dwoma poleceniami, a także wyjaśnia często obserwowaną różnicę kolorystyczną. Więc +1.
Eliah Kagan
3

W razie wątpliwości porównaj type lsvs type dir(patrz także Różnica między ls a 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

Różnica sprowadza się do różnych opcji ls, w moim przypadku --color=ttybyłby najbardziej widoczny, twój system może się różnić.

użytkownik2394284
źródło
2
To wcale nie wygląda na domyślną konfigurację użytkownika Ubuntu. Nie sądzę, aby którykolwiek z systemów Ubuntu, z których korzystałem, miałby lsalias dla funkcji o nazwie _ls- nawet jako komentarz w linii .bashrc. Wydaje się jednak, że jest to domyślna (przynajmniej niektóre wersje) openSuSE, sądząc po tej rozmowie , ten plik (link stamtąd) i moja (prawdopodobnie być może błędna) pamięć o tym, kiedy ostatnio użyłem openSUSE.
Eliah Kagan
2
@EliahKagan: Zgadłeś, używam OpenSuse! Tak jak powiedziałem, wynik będzie różny, ale metoda powinna być w porządku.
user2394284
2

Krótka odpowiedź: Brak, dirjest to ten sam kod źródłowy ls, lsco --colordomyślnie binarne . (1 linia różnicy kodu)

Francisco Valdez
źródło
7
dirto nie aliasem ls. Są oddzielne pliki binarne w /usr/binktóre zachowują się w różny sposób, jak to opisano w Rinzwind „s odpowiedź . Możesz to osiągnąć za pomocą aliasów, ale nie tak to się osiąga. Oddzielne diri lsbinarne pojawiają się we wszystkich systemach korzystających z GNU Coreutils . Jeśli potrzebujesz dowodu, biegnij cmp /bin/ls /bin/dir.
Eliah Kagan
2
jakiś czas temu był to alias i można go było wyświetlić na liście aliasów po prostu przez wpisanie alias, teraz skompilowano nowy plik binarny dla reż. Można pobrać swój kod z: git clone git://git.sv.gnu.org/coreutils. Tylko jedna linia kodu jest zmieniana w LS-dir.c i jest to: int ls_mode = LS_MULTI_COL;. Technicznie nie jest to alias, ale praktycznie jest to LS, ale z różnymi domyślnymi opcjami (1 linia kodu).
Francisco Valdez
1
Tak, dirto lsjednak z różnymi opcjami domyślnymi . diri lszawsze były oddzielnymi plikami binarnymi w dystrybucjach korzystających z GNU Coreutils. Niektóre dystrybucje mogą, lub mogą, również definiować alias o nazwie dir(definiowanie aliasów o takich samych nazwach jak istniejące polecenie jest dość powszechne). Są to jednak osobne pliki wykonywalne. Rozróżnianie aliasu powłoki (który wcale nie jest plikiem) od osobnego pliku wykonywalnego z podobnym kodem źródłowym, nie jest pedantycznym rozróżnieniem. Powiedzenie, że dirjest to pseudonim lsw Ubuntu, jest zarówno fałszywe, jak i mylące .
Eliah Kagan
Tak, zgadzam się z tobą, ale w tym przypadku nie jest podobny kod źródłowy, to ten sam kod źródłowy. Jeśli mówimy, że alias jest tylko czymś na liście, aliasto oczywiście nie jest to alias.
Francisco Valdez
3
To nie jest ten sam kod źródłowy. Jak powiedziałeś, „jedna linia źródła została zmieniona”. A jeśli byłoby to to samo źródło, to nadal nie byłby to pseudonim. W systemie uniksowym jest wiele rzeczy, które są podobne do aliasów, ale które byłyby bardzo mylące dla początkujących (i irytujące dla doświadczonych użytkowników) nazywania aliasów. Dowiązania symboliczne, dowiązania twarde, identyczne pliki, podobne pliki, skrypty otoki, wbudowane powłoki ukrywające pliki wykonywalne i pliki synchronizowane (np. Z UbuntuOne) są w znacznym stopniu podobne do aliasów, ale nie są to aliasy.
Eliah Kagan