it-swarm.dev

Rozdíl mezi příkazy terminálu 'dir' a 'ls'?

Pokoušel jsem se najít rozdíl mezi použitím příkazů dir a ls v terminálu. Vím, že ls je tradiční metoda UNIX pro prohlížení souborů v adresáři a že dir je příkaz Windows ekvivalent Prompt, ale oba příkazy fungují v terminálu.

Pokud zadám dir, zobrazí se soubory a složky v adresáři a pokud napíšu ls, bude to stejné, s výjimkou zvýraznění obsahu. Oba příkazy přijímají možnosti (tj. ls -a a dir -a oba vrátí všechny soubory a složky i skryté soubory.

Ví tedy někdo, jaký je rozdíl a proč jsou použity dir a ls?

78
BretD

dir a ls jsou součástí coreutils a dir je téměř stejné jako ls, pouze s různé výchozí možnosti.

Základní nástroje GNU GNU $ ===) jsou základní obslužné programy pro manipulaci se soubory, Shell a textem operačního systému GNU). Jedná se o základní nástroje, u nichž se očekává, že budou existovat ve všech operační systém.

info dir říká:

dir je ekvivalentní s ls -C -b; to znamená, že ve výchozím nastavení jsou soubory uvedeny ve sloupcích, seřazené svisle a speciální znaky jsou reprezentovány únikovými sekvencemi zpětného lomítka.

Jo a existuje také vdir! info vdir říká:

vdir je ekvivalentní s ls -l -b; to znamená, že ve výchozím nastavení jsou soubory uvedeny v dlouhém formátu a speciální znaky jsou reprezentovány únikovými sekvencemi zpětného lomítka.

Nejpravděpodobnější dir existuje pro zpětnou kompatibilitu nebo z historických důvodů.

72
Rinzwind

Vztah mezi ls a dir

ls a dir jsou samostatné programy, které se chovají podobně. Jak je vysvětleno a odkazováno níže, účelem dir je poskytnout příkaz jako ls, jehož výstup se nemění v závislosti na tom, zda jde o terminál . Aby toho bylo dosaženo, musí dir formátovat svůj výstup způsobem, který je přiměřený a užitečný jak pro prohlížení v terminálu, tak pro zápis do souboru nebo kanálu.

O dir existují dvě běžné mylné představy:

  • Mnoho lidí věří, že dir je alias ls, ale tomu tak není. Žádný příkaz není alias druhého a ve výchozím nastavení v Ubuntu dir není alias vůbec. ls a dir jsou poskytovány samostatnými neidentickými spustitelnými soubory.
  • Mnoho lidí věří, že dir existuje z nejasných historických důvodů nebo za účelem zajištění kompatibility s některým standardem nebo jiným operačním systémem. To také není pravda. ls se chová jako kompatibilita. dir, který nemusí být kompatibilní, protože se nejedná o standardní příkaz Unix, chová se alternativním způsobem, který vývojáři považují za cenné samy o sobě a možná dokonce za výhodnější.

Dobře, ale jak se liší ls a dir?

ls i dir uvádí obsah adresářů. Rozlišují je dva specifické rozdíly v jejich výchozím chování.

  1. Když je standardní výstup terminál, ls vypíše názvy souborů ve vertikálně seřazených sloupcích (jako ls -C). Pokud jeho standardní výstup není terminál (například soubor nebo pipe ), ls vypíše názvy souborů na řádek (například ls -1).

    Ať už je jeho standardní výstup terminál, dir vypíše názvy souborů ve svisle seřazených sloupcích (jako ls -C).

    Pro obě ls a dir mohou být tato výchozí nastavení potlačena příznakem --format= A -1, -C, -m A -x Příznaky, které zkracují konkrétní možnosti --format=. Viz 10.1.4 Obecné formátování výstup v GNU coreutils reference manual pro podrobnosti.

  2. Když je jeho standardní výstup terminál a název souboru, který má být uveden, obsahuje kontrolní znaky , ls vytiskne ? Místo každého kontrolního znaku (jako ls -q ). Když jeho standardní výstup není terminál, ls vytiskne kontrolní znaky tak, jak jsou (jako ls --show-control-chars).

    Ať už je nebo není jeho standardní výstup terminál, když dir narazí na kontrolní znak nebo jakýkoli jiný znak, který by byl interpretován speciálně, pokud by byl vložen do shellu, vytiskne pro znaky znaky zpětného lomítka. To zahrnuje i relativně běžné znaky jako mezery. Například dir vypíše položku nazvanou Documents backups Jako Documents\ backups. Je to jako ls -b.

    Pro oba ls a dir mohou být tato výchozí nastavení potlačena příznaky uvedenými v 10.1.7 Formátování názvů souborů v referenční příručka GNU coreutils) . To zahrnuje -b, -q, --quoting-style= A některé další.

Zdroje: ls vyvolání a dir vyvolání , v GNU coreutils reference manual .

Proč dir?

Odůvodnění samostatného obslužného programu dir je uvedeno v 4.5 Obecně standardy pro rozhraníGNU kódovací standardy . Doporučuji, abyste si přečetli celou tuto část, abyste pochopili zdůvodnění vývojářů, ale zde jsou nejdůležitější informace použitelné pro ls/dir:

Neupravujte chování obslužného programu podle jména použitého k jeho vyvolání ....

Místo toho použijte volbu doby běhu nebo přepínač kompilace nebo obojí pro výběr mezi alternativní chování ....

Stejně tak nedělejte, aby chování programu příkazového řádku záviselo na typu výstupního zařízení ....

Kompatibilita vyžaduje, aby určité programy závisely na typu výstupního zařízení. Bylo by katastrofální, kdyby ls nebo sh tak neučinily tak, jak všichni uživatelé očekávají. V některých případech doplníme program preferovanou alternativní verzí, která nezávisí na typu výstupního zařízení. Například poskytujeme program dir podobně jako ls s tím rozdílem, že jeho výchozí výstupní formát je vždy ve více sloupcích.

Projekt GNU) považuje z technického hlediska za nežádoucí, aby obslužný program produkoval odlišný výstup v závislosti na tom, jaké zařízení zapisuje (alespoň ve výchozí konfiguraci obslužného programu). obslužné programy, včetně ls, výstup závislý na zařízení je nezbytný pro kompatibilitu, takže funguje tak, jak uživatelé očekávají. Někteří uživatelé také toto chování závislé na zařízení specificky preferují.

Zatímco ls nelze rozumně zapisovat, aby se chovalo zařízení samostatně, k dosažení tohoto cíle byl vytvořen samostatný nástroj dir. dir tedy není nástroj, který se chová kupodivu z důvodů historické kompatibility --ls is.

Chcete-li vidět, jak jsou implementovány ls, dir a související obslužný program vdir ve zdrojovém kódu coreutils bez zbytečné duplikace kódu, viz ls-dir.c , ls-ls.c , ls-vdir.c , ls.h a ls.c .

Je dir opravdu užitečné?

Pokud jste si někdy přáli, aby ls produkoval vícesloupcový výstup, i když jste jej vložili do less (ls | less) Nebo jej přesměrovali do souboru (ls > out.txt) ), můžete použít dir nebo ls -C.

Pokud jste si kdy přáli, můžete přímo zkopírovat název souboru zobrazený pomocí ls a použít jej jako součást příkazu bez obav z citace, můžete použít dir nebo ls -b.

dir je ekvivalentní s ls -Cb, takže v tomto smyslu nepotřebujete dir. dir však poskytuje kombinaci možností, které jsou v praxi často užitečné (i když o nich nejsou obecně známy).

Proč získám barevný výstup z ls (dokonce ls -Cb), Ale ne z dir ?!

Většina uživatelů Ubuntu má přezdívku s názvem ls, která spouští ls --color=auto. Když ls existuje jak jako alias, tak jako externí příkaz, má alias přednost v jednoduchých interaktivních příkazech.

Definice aliasu se rekurzivně nerozšiřují - je to externí příkaz ls, který alias ls volá s --color=auto. Viz 6.6 Aliasy v referenční příručka Bash , kde jsou další informace o tom, jak aliasy fungují.

Při předání ls, dir nebo vdir (a některým dalším příkazům, například grep), --color=auto Použije barvu, když je na výstupu je terminál, ale ne jinak.

Ve výchozím nastavení jsou v Ubuntu vytvářeny uživatelské účty v ~/.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

Všimněte si, že alias ls (alias ls='ls --color=auto') Není označen, zatímco pro dir a vdir jsou komentáře s #, Takže nemají žádný účinek. To znamená, že zatímco dir není alias, ls je (ale nikoli dir).

Jak vytvořím dir také produkci barevného výstupu?

Chcete-li povolit barevný výstup pomocí dir, jednoduše upravte .bashrc Ve vašem domovském adresáři a zrušte začátek řádku #alias dir='dir --color=auto' Odebráním úvodního #. Ve skořápkách zahájených po změně bude dir alias.

Pokud chcete změnu v aktuálním prostředí, můžete spustit definici aliasu jako příkaz, nebo můžete zdroj .bashrc Spustit spuštěním . ~/.bashrc.

To je pravděpodobně v rozporu s hlavním bodem dir--, že by měl produkovat stejný druh výstupu bez ohledu na výstupní zařízení. Nicméně:

  • Pokud je pro vás užitečné vytvořit tento alias dir, určitě byste to měli udělat.
  • Pokud je příkaz zavolán jako externí příkaz, například ve skriptech nebo pokud přepíšete alias spuštěním \dir Nebo command dir, dir bude stále produkovat výstup nezávislý na zařízení. To znamená, že aliasy dir to dir --color=auto Opravdu neporuší dir.
56
Eliah Kagan

Rád bych si myslel, že dir je tam jen pro zpětnou kompatibilit .

Od GNU Coreutils :

dir je ekvivalentní ls -C -b; to znamená, že ve výchozím nastavení jsou soubory uvedeny ve sloupcích, seřazené svisle a speciální znaky jsou reprezentovány únikovými sekvencemi zpětného lomítka.

Mimochodem, ls ve výchozím nastavení nebarví výstup: je to proto, že většina alias distros ls to ls --color=auto v /etc/profile.d. Pro test zadejte unalias ls potom zkuste ls: bude bezbarvá.

Zdroj: Renan 's odpověď na Jaký je rozdíl mezi „dir“ a „ls“ ?

5
user45853

V případě pochybností porovnejte type ls vs type dir (viz také Rozdíl mezi ls 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+"[email protected]"}
}
$ echo command ls $LS_OPTIONS ${1+"[email protected]"}
command ls -N --color=tty -T 0

Rozdíl se zmenšuje na různé možnosti ls, v mém případě --color=tty by bylo nejviditelnější, váš systém se může lišit.

3
user2394284

Krátká odpověď: Žádné, dir je stejný zdrojový kód než ls, ls binary mít --color ve výchozím stavu. (1 řádek rozdílu kódu)

2
Francisco Valdez