Związek między ls
idir
ls
i dir
są osobnymi programami, które zachowują się podobnie. Jak wyjaśniono i przywołano poniżej, celem dir
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
:
- Wiele osób uważa, że
dir
jest to pseudonim ls
, ale tak nie jest. Żadne z poleceń nie jest aliasem drugiego i domyślnie w Ubuntu dir
wcale nie jest aliasem. ls
i dir
są 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. 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
i dir
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 (jak ls -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 (jak ls -1
).
Niezależnie od tego, czy jego standardowym wyjściem jest terminal, dir
wyświetla nazwy plików w pionowo posortowanych kolumnach (jak ls -C
).
Dla obu ls
, a dir
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 (jak ls -q
). Gdy jego standardowym wyjściem nie jest terminal, ls
wypisuje znaki kontrolne takimi, jakie są (jak ls --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ład dir
wyświetli wpis o nazwie Documents backups
as Documents\ backups
. To jest jak ls -b
.
Dla obu ls
, a dir
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ą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 ls
albo sh
nie 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 dir
program podobny do
ls
tego, ż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 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 osobne dir
narzędzie, aby to osiągnąć. Zatem dir
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ązane vdir
narzę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 dir
naprawdę przydatne?
Jeśli kiedykolwiek chciałeś ls
wyprodukować wyjście wielokolumnowe, nawet gdy potokowałeś je do less
( ls | less
) lub przekierowałeś do pliku ( ls > out.txt
), możesz użyć dir
lub ls -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
lub ls -b
.
dir
jest równoważne ls -Cb
, więc w tym sensie nie potrzebujesz dir
. Ale dir
zapewnia 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, ls
który działa ls --color=auto
. Gdy ls
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órego ls
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
lub vdir
(i inne rozkazy, jak grep
) --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
:
# 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 ls
alias ( alias ls='ls --color=auto'
) nie jest komentowany , a te za dir
i vdir
są komentowane, #
więc nie działają. Oznacza to, że chociaż dir
nie jest aliasem, ls
jest (ale nie do dir
) .
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 zmianie dir
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:
- Jeśli uznasz, że użyteczne jest utworzenie tego
dir
aliasu, powinieneś to zrobić.
- Wywoływany jako polecenie zewnętrzne, na przykład w skryptach lub w przypadku zastąpienia aliasu przez uruchomienie
\dir
lub command dir
, dir
nadal będzie generować wynik niezależny od urządzenia. To znaczy, że aliasing dir
do dir --color=auto
tak naprawdę się nie psuje dir
.
dir --color
;)