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.
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 .
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.
dir --color;)