Próbowałem znaleźć różnicę między używaniem poleceń dir
i ls
w terminalu. Wiem, że ls jest tradycyjną metodą UNIXową przeglądania plików w katalogu, i dir
jest 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 -a
I dir -a
oba zwracają wszystkie pliki i foldery oraz pliki ukryte.
Więc czy ktoś wie jaka jest różnica i dlaczego obie dir
i ls
są wykorzystywane?
command-line
directory
ls
coreutils
BretD
źródło
źródło
dir --color
;)Odpowiedzi:
dir
ils
są częściącoreutils
idir
są prawie takie same jakls
, tylko z różnymi opcjami domyślnymi.info dir
mówi:Aha i jest też
vdir
!info vdir
mówi:Najprawdopodobniej
dir
istnieje ze względu na kompatybilność wsteczną lub z powodów historycznych.źródło
alias dir
aby zobaczyć, co to właściwie jest. wpisz,alias
aby zobaczyć wszystkie aliasy.type dir
aby zobaczyć, co to jest (alias, polecenie, funkcja bash ...)Związek między
ls
idir
ls
idir
są osobnymi programami, które zachowują się podobnie. Jak wyjaśniono i przywołano poniżej, celemdir
jest dostarczenie polecenia,ls
którego wynik nie zmienia się w zależności od tego, czy trafi on do terminala . Aby osiągnąć ten cel,dir
należ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
:dir
jest to pseudonimls
, ale tak nie jest. Żadne z poleceń nie jest aliasem drugiego i domyślnie w Ubuntudir
wcale nie jest aliasem.ls
idir
są dostarczane przez oddzielne, nieidentyczne pliki wykonywalne.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.ls
zachowuje 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
ls
czym siędir
różnią i czym się różnią?Zarówno
ls
idir
wyświetla zawartość katalogów. Wyróżniają je dwie szczególne różnice w ich domyślnych zachowaniach.Gdy jego standardowym wyjściem jest terminal,
ls
wyświetla nazwy plików w pionowo posortowanych kolumnach (jakls -C
). Gdy jego standardowym wyjściem nie jest terminal (na przykład plik lub potok ),ls
wyświetla nazwy plików po jednym w wierszu (jakls -1
).Niezależnie od tego, czy jego standardowym wyjściem jest terminal,
dir
wyświetla nazwy plików w pionowo posortowanych kolumnach (jakls -C
).Dla obu
ls
, adir
te błędy mogą zostać zastąpione przez--format=
flagę i przez-1
,-C
,-m
i-x
flagi, 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 .Gdy jego standardowym wyjściem jest terminal, a nazwa pliku, która ma zostać wymieniona, zawiera znaki sterujące ,
ls
drukuje?
zamiast każdego znaku sterującego (jakls -q
). Gdy jego standardowym wyjściem nie jest terminal,ls
wypisuje znaki kontrolne takimi, jakie są (jakls --show-control-chars
).Bez względu na to, czy jego standardowym wyjściem jest terminal, gdy
dir
napotka 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ładdir
wyświetli wpis o nazwieDocuments backups
asDocuments\ backups
. To jest jakls -b
.Dla obu
ls
, adir
te 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
dir
narzę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ącels
/dir
: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
ls
zależ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ż
ls
nie można było rozsądnie napisać, że zachowuje się niezależnie od urządzenia, stworzono osobnedir
narzędzie, aby to osiągnąć. Zatemdir
nie jest to narzędzie, które zachowuje się dziwnie ze względu na historyczną zgodność -ls
jest .Aby zobaczyć, jak
ls
,dir
i związanevdir
narzędzie są zaimplementowane w kodzie źródłowym coreutils bez kodu niepotrzebnego powielania, zobaczls-dir.c
,ls-ls.c
,ls-vdir.c
,ls.h
, ils.c
.Czy to
dir
naprawdę przydatne?Jeśli kiedykolwiek chciałeś
ls
wyprodukować wyjście wielokolumnowe, nawet gdy potokowałeś je doless
(ls | less
) lub przekierowałeś do pliku (ls > out.txt
), możesz użyćdir
lubls -C
.Jeśli kiedykolwiek chciałeś, aby bezpośrednio skopiować nazwę pliku pokazaną przez
ls
i używać jej jako części polecenia, nie martwiąc się o cytowanie , możesz użyćdir
lubls -b
.dir
jest równoważnels -Cb
, więc w tym sensie nie potrzebujeszdir
. Aledir
zapewnia kombinację opcji, które w praktyce są często przydatne (choć nie są powszechnie znane).Dlaczego otrzymuję pokolorowane wyjście
ls
(nawetls -Cb
), ale niedir
?Większość użytkowników Ubuntu ma alias o nazwie,
ls
który działals --color=auto
. Gdyls
istnieje 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
ls
polecenie, za pomocą któregols
alias 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
,dir
lubvdir
(i inne rozkazy, jakgrep
)--color=auto
wykorzystuje 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
:Zauważysz, że
ls
alias (alias ls='ls --color=auto'
) nie jest komentowany , a te zadir
ivdir
są komentowane,#
więc nie działają. Oznacza to, że chociażdir
nie jest aliasem,ls
jest (ale nie dodir
) .Jak mogę również
dir
produkować kolorowe wydruki?Aby włączyć kolorowe wydruki
dir
, po prostu edytuj.bashrc
w swoim katalogu domowym i odkomentuj#alias dir='dir --color=auto'
linię, usuwając wiodące#
. W powłokach rozpoczętych po zmianiedir
będzie alias.Jeśli chcesz zmiany w bieżącej powłoce, możesz uruchomić definicję aliasu jako komendę lub możesz
.bashrc
ją 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:dir
aliasu, powinieneś to zrobić.\dir
lubcommand dir
,dir
nadal będzie generować wynik niezależny od urządzenia. To znaczy, że aliasingdir
dodir --color=auto
tak naprawdę się nie psujedir
.źródło
Źródło: Renan jest odpowiedzią na czym polega różnica między «dir» i «LS» ?
źródło
dir
jest zapewniona kompatybilność wsteczna - als
tak 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.W razie wątpliwości porównaj
type ls
vstype dir
(patrz także Różnica między ls a la ):Różnica sprowadza się do różnych opcji
ls
, w moim przypadku--color=tty
byłby najbardziej widoczny, twój system może się różnić.źródło
ls
alias 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.Krótka odpowiedź: Brak,
dir
jest to ten sam kod źródłowyls
,ls
co--color
domyślnie binarne . (1 linia różnicy kodu)źródło
dir
to nie aliasemls
. Są oddzielne pliki binarne w/usr/bin
któ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. Oddzielnedir
ils
binarne pojawiają się we wszystkich systemach korzystających z GNU Coreutils . Jeśli potrzebujesz dowodu, biegnijcmp /bin/ls /bin/dir
.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).dir
tols
jednak z różnymi opcjami domyślnymi .dir
ils
zawsze były oddzielnymi plikami binarnymi w dystrybucjach korzystających z GNU Coreutils. Niektóre dystrybucje mogą, lub mogą, również definiować alias o nazwiedir
(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, żedir
jest to pseudonimls
w Ubuntu, jest zarówno fałszywe, jak i mylące .alias
to oczywiście nie jest to alias.