non lo fanno, non è solo a determinate condizioni gara, ma anche i [ -e /path/file ]
controlli se è possibile eseguire un stat(2)
su un file, restituirà false per motivi diversi, non solo perché il file non può esistere.
Un esempio è un collegamento simbolico a un file che non esiste o un file in una directory per cui non si dispone dell'autorizzazione alla ricerca.
Un approccio molto migliore consiste nell'utilizzare i contrassegni giusti per la chiamata di sistema open(2)
qui, ovvero O_CREAT|O_EXCL
. In questo modo, lo open()
non riesce se il file non esiste già senza dover controllare più volte i tick di clock della CPU.
Con una shell Bourne simile:
if (set -C && : > "$file") 2> /dev/null; then
print '%s\n' "$file has been created
else
print '%s\n' "It hasn't, possibly because it was already there"
fi
(set -C
è quello di consentire la bandiera O_EXCL
).
Inoltre, perché si desidera creare un file vuoto? È probabile che tu voglia archiviare qualcosa in quel file.Poi, basta farlo:
set -C
{
echo blah
other-commands that-generate-the-content
} > "$file"
Poi, quel gruppo comando viene eseguito solo se il file
non esistesse già (ed è stato possibile crearlo).
Se si desidera verificare l'esistenza per il file, scrivere almeno:
[ -e "$file" ] || [ -L "$file" ]
o
ls -d -- "$file" > /dev/null 2>&1
se ti interessa potenzialmente essere un collegamento simbolico. Ciò restituirà comunque false se il file esiste ma non hai il diritto di verificarlo.
Ora, se si desidera una risposta più lunga e storica di test per il file esistenza:
Inizialmente, il comando test
(in v7 Unix dove prima apparizione) had no -e
(nor -h
/-L
option or -a
unary) opzione.
Il modo di verificare l'esistenza del file era con ls
. ls
(con -d
) elenca il file e segnala un errore (e restituisce lo stato di uscita false) se non riesce a cercare il file per un motivo o per un altro. Inizialmente, Unix non disponeva di collegamenti simbolici, ma al momento dell'introduzione, ls
è stato modificato per fare un lstat(2)
su un file anziché stat(2)
. Cioè, in caso di symlink ls
restituisce informazioni sul file symlink stesso, non sul file nel percorso a cui punta il collegamento simbolico.
Un'opzione per test
(aka [
) per il test per il file "esistenza" è stato introdotto nel Korn shell test
builtin. Era -a
, non -e
. -a
è per accessibile (credo) che è un termine più accurato di esistente.
Non so quando o cosa ha introdotto -e
, possibilmente POSIX. POSIX says che -e
stato scelto sopra -a
per evitare la possibile confusione con il -a
binario operatore (ad e).
In entrambi i casi, sia -a
sia -e
tentare uno stat(2)
sul file, non uno lstat(2)
. Cioè:
[ -e "$file" ]
è equivalente a:
ls -Ld -- "$file" > /dev/null 2>&1
Quindi, a rigor di termini, restituisce vero se, al momento del test è stato fatto, è stato possibile per cercare il percorso dopo aver risolto i link simbolici e se stat(2)
non riesce, il motivo dell'errore viene ignorato.
stat
potrebbe non riuscire se il file non esiste (ENOENT
), ovvero se il file non esiste o esiste ma è un collegamento simbolico a un file che non esiste, ma anche per molte altre ragioni.Guardando the possible error codes of stat(2)
dà alcune idee:
EACCESS
: durante la risoluzione del percorso (e che può essere qualsiasi componente del percorso e nel percorso di qualsiasi link simbolico), non dovete ricerca il permesso per una directory componente (si noti che si può ancora avere accesso al file tramite un altro percorso).
ELOOP
: impossibile risolvere il percorso a causa di troppi collegamenti simbolici risolti per arrivarci.
ENOTDIR
. Per esempio su /etc/passwd/foo
o un link simbolico ad esso.
Se sei interessato agli script di bash, un'ottima risorsa è http://www.tldp.org/LDP/abs/abs-guide.pdf –
Grazie, amico! Beh, ad essere onesti ho pensato che questa sarebbe stata la parte corretta di Stack Exchange per rispondere a questo tipo di domande. –
È il posto giusto. La tua domanda è sull'argomento qui, @Patrick shell scripting è esplicitamente [sull'argomento] (http://unix.stackexchange.com/help/on-topic). Le domande di scripting di shell SO si perdono molto facilmente nel rumore, puoi chiedere loro dove ti senti più a tuo agio. – terdon