GNU/Linux >> Linux Esercitazione >  >> Linux

Perché rm manual dice che possiamo eseguirlo senza alcun argomento, quando questo non è vero?

La sinossi standard per rm l'utilità è specificata nello standard POSIX come

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

Nella sua prima forma, richiede almeno un operando file, ma nella sua seconda forma no.

Facendo rm -f senza operandi di file non è un errore:

$ rm -f
$ echo "$?"
0

... ma non fa molto.

Lo standard dice che per il -f opzione, il rm l'utilità dovrebbe...

Non chiedere conferma. Non scrivere messaggi diagnostici o modificare lo stato di uscita in caso di assenza di operandi di file o in caso di operandi inesistenti. Eventuali occorrenze precedenti di -i l'opzione deve essere ignorata.

Ciò conferma che deve essere possibile eseguire rm -f senza alcun operando di percorso e che questo non è qualcosa che rende rm esci con un messaggio diagnostico né uno stato di uscita diverso da zero.

Questo fatto è molto utile in uno script che tenta di eliminare un numero di file come

rm -f -- "[email protected]"

dove "[email protected]" è un elenco di percorsi che possono o meno essere vuoti o che possono contenere percorsi che non esistono.

(rm -f genererà comunque un messaggio diagnostico ed uscirà con uno stato di uscita diverso da zero se ci sono problemi di autorizzazione impedendo la rimozione di un file denominato.)

Tuttavia, l'esecuzione dell'utility senza opzioni né operandi di percorso è un errore:

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

Lo stesso vale per GNU rm (quanto sopra mostra OpenBSD rm ) e altre implementazioni della stessa utilità, ma il messaggio diagnostico esatto e lo stato di uscita diverso da zero potrebbero essere diversi (su Solaris il valore è 2 e su macOS è 64, ad esempio).

In conclusione, lo GNU rm manual potrebbe essere solo un po' impreciso in quanto è vero che con qualche opzione (-f , che è un'opzione facoltativa), l'operando del percorso è facoltativo.

dall'edizione 2016, dopo la risoluzione di questo bug, vedere l'edizione precedente per riferimento.
POSIX è lo standard che definisce cos'è un sistema Unix e come si comporta. Questo standard è pubblicato da The Open Group. Vedi anche la domanda "Cos'è esattamente POSIX?".


Tecnicamente, la sinossi è corretta, ma è confusa. Ci sono casi in cui non è necessario alcun nome file:

rm --help
rm --version

(quando si usa GNU rm ). Tutti gli altri casi richiedono un nome file.

Altre versioni di rm mostra il file come non facoltativo, ad es. nella manpage di OpenBSD.

Una sinossi più accurata per GNU rm mostrerebbe le tre varianti:

rm [opzioni ...] file ...
rm --help
rm --version


Linux
  1. Perché la sostituzione del processo Bash non funziona con alcuni comandi?

  2. Il comando "java" non esegue la JVM che è stata installata

  3. read(2) può restituire zero quando non è in EOF?

  4. Perché stdout necessita di uno svuotamento esplicito quando viene reindirizzato al file?

  5. gdb non raggiunge alcun punto di interruzione quando lo eseguo dall'interno del contenitore Docker

In Unix, posso eseguire 'make' in una directory senza prima accedere a quella directory?

Perché questa pipeline di shell termina?

Perché dice Non dobbiamo includere limiti.h! in dirent.h?

Perché rsync non utilizza il trasferimento delta per i file locali?

Perché wget'ing un'immagine mi dà un file, non un'immagine?

Perché wine può eseguire programmi a 64 bit su Linux ma non su Mac?