it-swarm-eu.dev

Proč cd není program?

Vždycky jsem přemýšlel, proč cd není program, ale nikdy se mi nepodařilo najít odpověď.

Někdo ví, proč tomu tak je?

131
AkshaiShah

Příkaz cd upravuje "aktuální pracovní adresář", že?

„aktuální pracovní adresář“ je vlastnost, která je pro každý proces jedinečná.

Takže pokud cd je program, bude to fungovat takto:

  1. cd foo
  2. spustí se proces cd
  3. proces cd změní adresář pro proces cd
  4. proces cd skončí
  5. váš Shell má stále stejný stav, včetně aktuálního pracovního adresáře, jaký byl před spuštěním.
173
Daniel Pittman

cd kromě toho, že je zabudován do prostředí Shell, je ve skutečnosti také programem v operačních systémech kompatibilních s POSIX. musí poskytují nezávislé spustitelné soubory pro běžné nástroje, jako je cd. To je například případ Solaris , AIX , HP-UX a OS X .

Je zřejmé, že vestavěné cd je stále povinné, protože jeho externí implementace nemění aktuální adresář Shell. Ta však může být stále užitečná. Zde je příklad ukazující, jak POSIX předpokládá, jak lze tento příkaz cd použít:

find . -type d -exec cd {} \;

V systému POSIX tento oneliner nahlásí chybovou zprávu pro všechny adresáře, do nichž nemáte povoleno cd in. U většiny distribucí Gnu/Linux se tato chybová zpráva nezdaří:

find: `cd': No such file or directory

A zde je odpověď na vaši otázku: " Proč cd není program? " od jednoho z původních spoluautorů Unixu. Při velmi rané implementaci Unixu byl cd (tehdy hláskovaný chdir) externím programem. Po první implementaci fork to přestalo neočekávaně fungovat.

Citace Dennis Ritchie:

Uprostřed našeho jásání se zjistilo, že příkaz chdir (změnit aktuální adresář) přestal fungovat. Tam bylo hodně čtení kódu a úzkostné introspekce o tom, jak přidání vidlice mohlo přerušit chdirovo volání. Nakonec pravda vyšla: ve starém systému byl chdir obyčejným příkazem; upravil aktuální adresář (jedinečného) procesu připojeného k terminálu. V novém systému příkaz chdir správně změnil aktuální adresář procesu vytvořeného k jeho provedení, ale tento proces byl okamžitě ukončen a neměl žádný vliv na jeho nadřazené prostředí Shell! Bylo nutné, aby se chdir stal zvláštním příkazem, prováděným interně uvnitř Shell. Ukázalo se, že několik příkazových funkcí má stejnou vlastnost, například přihlášení.

Zdroj: Dennis M. Ritchie, „ Vývoj unixového systému sdílení čas “, AT&T Bell Laboratories Technical Journal 63 (6), část 2, říjen 1984, s. 1577–93

Unix verze 1 (březen 1971) chdir stránka manuál uvádí:

Protože je vytvořen nový proces pro provádění každého příkazu, chdir by byl neúčinný, kdyby byl zapsán jako normální příkaz. Je proto uznáno a provedeno Shell.

108
jlliagre

Od úvodu Bash ( Co je to shell? ):

Shells také poskytují malou sadu vestavěných příkazů (vestavěné) implementující funkce nemožné nebo nepohodlné získat pomocí samostatných utilit. Například cd, break, continue a exec) nelze implementovat mimo Shell, protože přímo manipulují s Shell samotným. Vestavby history, getopts, kill nebo pwd by mohly být implementovány do samostatných utilit, ale je vhodnější je použít jako vestavěné příkazy. Všechny vestavěné Shell jsou popsány v následujících částech.

47
cjc

Letos v dubnu jsem napsal samostatná verze cd .

Nikdo nemá vtip. Povzdech.

Každý, kdo si není jistý, že cd musí být zabudován do Shell, by si ho měl stáhnout, postavit a zkusit to.

Přečtěte si také jeho manuálovou stránku. :)

29
Warren Young

Příkaz cd v prostředí Shell nemůže být samostatným procesem, protože v Unixu neexistuje mechanismus pro změnu aktuálního pracovního adresáře jiného procesu (ani nadřazeného procesu).

Pokud by cd byl jiný proces, musel by změnit aktuální pracovní adresář svého nadřazeného (Shell), což není možné v Unixu. Místo toho cd je speciální vestavěný příkaz. Shell volá funkce jako chdir() a fchdir() mění svůj vlastní aktuální pracovní adresář.

Poznámka: jádro ukládá inode číslo aktuálního pracovního adresáře pro každý proces. Podřízený proces zdědí, že je cwd od svého nadřazeného.

4
saurav1405

cd je vestavěný příkaz Shell. Tak snadné, jak je. Mužské cd to všechno říká. příkaz cd změní pracovní adresář pro všechny tlumočníky a (v prostředí se závity) všechna vlákna.

0
user18925