GNU/Linux >> Znalost Linux >  >> Linux

Jaký je důvod, proč rmdir(1) a rm(1) koexistují?

Hlavní důvod je pravděpodobně historický. Za starých časů žádné rmdir(2) neexistovaly a mkdir(2) systémová volání (zde diskutujeme o 7. vydání UNIX™) a rmdir(1) byl (nezbytně) kořenový program SUID, který používal unlink(2) systémové volání k odstranění adresářů.

Příručky 7th Edition UNIX jsou dostupné online na http://cm.bell-labs.com/7thEdMan (naposledy zkontrolováno 2017-04-23); Jsou také k dispozici na http://plan9.bell-labs.com/7thEdMan (naposledy zkontrolováno 2017-04-23). Zdá se také, že existuje alespoň jeden alternativní zdroj online — http://wolfram.schneider.org/bsd/7thEdManVol2/ — pro články ve svazku 2, s odkazem na stránku FreeBSD pro příkazy a systémová volání ve svazku 1 .

rm příkaz (běžný program bez SUID) vyvolal rmdir(1) příkaz k odstranění prázdných adresářů. Sama to udělat nemohla; které vyžadovaly práva roota. Takže rmdir(1) příkaz (viz zde pro jeho zdrojový kód v Unixu V7) existoval k odstranění prázdných adresářů a rm příkaz sám o sobě prázdné adresáře neodstranil.

Chcete-li použít rm pro odstranění adresářů musíte zadat -r možnost.

Existuje také argument symetrie. Potřebujete příkaz mkdir(1) vytvářet adresáře; zdá se rozumné mít příkaz rmdir(1) vrátit zpět co mkdir(1) dělal. Navíc jsou (dnes) jednoduchými cvičeními rmdir(2) a mkdir(2) systémová volání – ano, v 7. vydání UNIX, mkdir(1) byl také kořenový program SUID používající mknod(2) volání k vytvoření adresářového uzlu a link(2) volání pro vytvoření . a .. záznamy v adresáři.


"rm" nefunguje v adresářích. Pro rekurzivní smazání musíte buď použít rmdir, nebo zadat přepínač -r. Důvod je historický:unlink a rmdir jsou samostatná systémová volání a jsou od počátků Unixu.


Také rmdir odstraní pouze prázdné adresáře. Pokud se chcete ujistit, že nesmažete žádné další soubory v adresáři, rmdir je bezpečnější než rm -r (kromě případů, kdy jste vytvořili alias rm tak, že musíte vždy potvrdit, co smažete, tj. alias rm='rm -i' v ~/.bashrc nebo v čemkoli, co používáte).


Linux
  1. Jaký je rozdíl mezi strtok_r a strtok_s v C?

  2. Jaký je rozdíl mezi fsck a e2fsck?

  3. Jaký je rozdíl mezi adduser a useradd?

  1. Jaké je ID oddílu / typ souborového systému pro UDF?

  2. Jaký je rozdíl mezi `su -` a `su --login`?

  3. Jaký je rozdíl mezi $(CC) a $CC?

  1. Point of Uniq -u a co to dělá??

  2. Jaké je rozhraní pro systémová volání ARM a kde je definováno v jádře Linuxu?

  3. Co je nástroj syslog pro auditované protokoly?