Twoje oczekiwania są oparte na DOS Think / Windows Think i są błędne. W MS-DOS, Windows i rzeczywiście w kilku innych systemach operacyjnych IBM / Microsoft, interpretacja symboli zastępczych odbywa się przez samą komendę, a /a
opcje takie jak opcja dir
działają jako filtry atrybutów podczas ekspansji symboli zastępczych. dir
rozwija znaki wieloznaczne, takie jak *
, które interpreter poleceń przekazuje do niego w stanie, w jakim są, a jeśli /a
jest określony, stosuje odpowiednie filtry do zwracanych danych. (W niektórych systemach operacyjnych filtry atrybutów można nadać wywołaniu systemowemu w celu wyliczenia katalogu, a jądro systemu operacyjnego lub jego sterowniki systemu plików zastosują je same).
W systemach Unices i Linux rozszerzanie symboli wieloznacznych odbywa się przez powłokę i nie zależy od uprawnień. Kiedy robisz to w katalogu głównym
ls *
to, co ls
samo polecenie otrzymuje z powłoki (coś w stylu)
ls bin home opt var boot boot tmp etc utracone + znalezione root usr
Co -d
/ --directory
opcja robi to wyłączyć, co zwykle dzieje się dalej . To, co zwykle dzieje się potem, polega na tym, że ls
analizuje kolejno każdy z argumentów, widzi, że są to katalogi i postanawia wyliczyć ich zawartość. W przypadku argumentów, które nazywają pliki, po prostu wypisuje informacje o samym pliku. Dzięki tej -d
opcji katalogi są traktowane jak pliki. Tak więc ls
wypisuje informacje dla każdego z katalogów, które są przekazywane jako argumenty, tak jak zrobiłby to, gdyby były plikami.
Nie -d
jest to więc opcja „drukuj tylko katalogi”. W rzeczywistości nie tylko nie ma takiej opcji; nie może być takiej opcji. Rozwijanie symboli wieloznacznych odbywa się przez powłokę i ( sh
przynajmniej w POSIX ) nie ma sposobu, aby powiedzieć powłoce, aby sprawdzała bity uprawnień i typów plików, gdy rozwija *
się do listy nazw. Aby uzyskać listę samych nazw katalogów, konieczne jest albo użycie find
polecenia, jak wyjaśniono ztank1013
, lub użycie sztuczki, w której nazwa ścieżki kończąca się ukośnikiem oznacza pozycję katalogu .
, jak wyjaśniono przez Jin
. ( Jin
lewą kończy się ls
polecenie otrzymujące argumenty
ls bin / home / opt / var / boot / dev / tmp / etc / lost + found / root / usr /
ponieważ wzorzec */
w rzeczywistości dopasowuje nazwy ścieżek do dwóch składników, drugi jest pusty, a więc nie do końca robi to, co było pożądane. W szczególności potraktuje dowiązania symboliczne wskazujące katalogi tak, jakby były katalogami).
Zachowanie ls -d
bez a *
jest prostym rozszerzeniem powyższego. Trzeba tylko wiedzieć jeszcze jedną rzecz ls
: Gdy nie podano żadnych argumentów, zakłada się domyślny argument .
. Teraz bez tej -d
opcji, wyżej wymienione przewody zachowanie do zawartości katalogu, nazwanych przez .
ich wyliczone, a informacje wyświetlane na jego zawartość. Dzięki tej -d
opcji katalog .
jest traktowany tak, jakby był plikiem, a wyświetlane są jego informacje, a nie ich zawartość.