GNU/Linux >> Znalost Linux >  >> Linux

Proč rm manuál říká, že to můžeme spustit bez jakéhokoli argumentu, když to není pravda?

Standardní synopse pro rm nástroj je specifikován ve standardu POSIX jako

rm [-iRr] file...
rm -f [-iRr] [file...]

Ve své první formě vyžaduje alespoň jeden souborový operand, ale ve své druhé formě nikoli.

Provádím rm -f bez souborových operandů není chyba:

$ rm -f
$ echo "$?"
0

... ale prostě to moc nedělá.

Standard říká, že pro -f možnost, rm nástroj by měl...

Nevyžadujte potvrzení. Nepište diagnostické zprávy ani neupravujte stav ukončení v případě operandů bez souboru nebo v případě operandů, které neexistují. Všechny předchozí výskyty -i možnost bude ignorována.

To potvrzuje, že musí být možné spustit rm -f bez jakýchkoli operandů názvu cesty a že to není něco, co dělá rm ukončete s diagnostickou zprávou ani s nenulovým stavem ukončení.

Tato skutečnost je velmi užitečná ve skriptu, který se pokouší smazat řadu souborů jako

rm -f -- "[email protected]"

kde "[email protected]" je seznam názvů cest, které mohou nebo nemusí být prázdné, nebo které mohou obsahovat názvy cest, které neexistují.

(rm -f stále vygeneruje diagnostickou zprávu a v případě problémů s oprávněním se ukončí s nenulovým stavem ukončení zabránění odstranění pojmenovaného souboru.)

Spuštění obslužného programu bez operandů opce ani cesty je chyba:

$ rm
usage: rm [-dfiPRrv] file ...
$ echo "$?"
1

Totéž platí pro GNU rm (výše ukazuje OpenBSD rm ) a další implementace stejného nástroje, ale přesná diagnostická zpráva a nenulový výstupní stav se mohou lišit (na Solarisu je hodnota 2 a na macOS je to například 64).

Na závěr GNU rm manuál může být trochu nepřesný, protože je pravda, že s nějakou volbou (-f , což je volitelná volba), operand názvu cesty je volitelný.

od vydání z roku 2016, po vyřešení této chyby, viz předchozí vydání.
POSIX je standard, který definuje, co je unixový systém a jak se chová. Tento standard vydává The Open Group. Viz také otázka „Co přesně je POSIX?“.


Technicky je synopse správná, ale je matoucí. Existují případy, kdy není potřeba žádný název souboru:

rm --help
rm --version

(při použití GNU rm ). Všechny ostatní případy vyžadují název souboru.

Jiné verze rm zobrazit soubor jako nepovinný, např. v manuálové stránce OpenBSD.

Přesnější synopse pro GNU rm zobrazí tři varianty:

rm [možnosti ...] soubor ...
rm --help
rm --version


Linux
  1. Proč substituce procesu Bash nefunguje s některými příkazy?

  2. Proč překladový soubor Bash neobsahuje všechny chybové texty?

  3. Proč „ukončit &“ nefunguje?

  1. Příkaz „java“ nespustí JVM, který byl nainstalován

  2. Proč tento plášťový ropovod vystupuje?

  3. gdb nenarazí na žádné body přerušení, když jej spustím z kontejneru Docker

  1. Proč rsync nepoužívá delta-transfer pro místní soubory?

  2. Proč mi wget'ing image dává soubor, ne obrázek?

  3. Proč tento regulární výraz nefunguje na linuxu?