nie rób tego, to nie tylko do wyścigu, ale także [ -e /path/file ]
kontrole jeśli możesz zrobić stat(2)
w pliku, więc zwróci wartość false z różnych powodów, nie tylko dlatego, że plik nie istnieje.
Przykładem jest dowiązanie symboliczne do pliku, który nie istnieje lub plik w katalogu, do którego nie masz uprawnień do wyszukiwania.
O wiele lepszym sposobem jest użycie odpowiednich flag do wywołania systemowego open(2)
, czyli O_CREAT|O_EXCL
. W ten sposób, open()
ulegnie awarii, jeśli plik nie istnieje, bez konieczności sprawdzania kilku milionów taktów zegara procesora wcześniej.
Z Bourne jak powłoki:
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
jest umożliwienie flagę O_EXCL
).
Ponadto, dlaczego chcesz utworzyć pusty plik? Prawdopodobnie chcesz zapisać coś w tym pliku.Następnie, po prostu to zrobić:
set -C
{
echo blah
other-commands that-generate-the-content
} > "$file"
następnie, że grupa komenda jest wykonywana tylko wtedy, gdy file
nie istnieje (a było to możliwe, aby go utworzyć).
Jeśli chcesz przetestować dla istnienia pliku, zapisz go co najmniej:
[ -e "$file" ] || [ -L "$file" ]
lub
ls -d -- "$file" > /dev/null 2>&1
jeśli dbają o to potencjalnie jest dowiązaniem symbolicznym. To nadal zwróci wartość false, jeśli plik istnieje, ale nie masz uprawnień do jego weryfikacji.
Teraz, jeśli chcesz dłużej i odpowiedzi na temat badań historycznych dla istnienia pliku:
Początkowo komenda test
(w Unix V7, gdzie po raz pierwszy pojawił) had no -e
(nor -h
/-L
option or -a
unary) opcja.
Sposób testowania istnienia pliku był zgodny z ls
. ls
(z -d
) wyświetla listę plików i zgłasza błąd (i zwraca kod zakończenia false), jeśli nie może wyszukać pliku z jakiegoś powodu. Początkowo uniks nie zawierał dowiązań symbolicznych, ale po ich wprowadzeniu zmieniono ls
, aby uzyskać plik lstat(2)
zamiast pliku stat(2)
. Oznacza to, że w przypadku dowiązania symbolicznego ls
zwraca informacje o samym pliku symlink, a nie o pliku na ścieżce, do której wskazuje dowiązanie symboliczne.
Opcja do test
(aka [
) do testowania dla pliku „istnienie” wprowadzono po raz pierwszy w Korn shell test
builtin. To był -a
, a nie -e
. -a
jest dla dostępny (uważam), który jest bardziej dokładny termin niż istniejących.
Nie wiem, kiedy lub co wprowadzono -e
, ewentualnie POSIX. POSIX says, który został wybrany pod numer pod numerem -a
w celu uniknięcia ewentualnego pomyłki z operatorem binarnym (dla i).
W każdym przypadku zarówno -a
, jak i -e
wypróbują w pliku stat(2)
, a nie lstat(2)
. Czyli:
[ -e "$file" ]
odpowiada:
ls -Ld -- "$file" > /dev/null 2>&1
Tak, ściśle rzecz biorąc, to zwraca wartość true, jeżeli w czasie badanie zostało zrobione, to było możliwe do wyszukiwania ścieżki po rozwiązywaniu dowiązania , a jeśli nie powiedzie się stat(2)
, przyczyna niepowodzenia zostanie zignorowana.
stat
może zakończyć się niepowodzeniem, jeśli plik nie istnieje (ENOENT
), to znaczy, jeśli plik nie istnieje lub istnieje ale jest dowiązaniem do pliku, który nie istnieje, ale także wiele innych powodów.Patrząc na the possible error codes of stat(2)
daje kilka pomysłów:
EACCESS
: Podczas uchwałą ścieżki (i to może być każdy składnik ścieżki i w drodze jakiegokolwiek dowiązania symbolicznego), nie masz wyszukiwarki zgodę na jednym katalogu składnik (pamiętaj, że możesz nadal mieć dostęp do pliku inną ścieżką).
ELOOP
: niemożliwe jest rozwiązanie ścieżki, ponieważ zbyt wiele dowiązań symbolicznych zostało rozwiązanych, aby się tam dostać.
ENOTDIR
. Na przykład na /etc/passwd/foo
lub dowiązanie symboliczne do niego.
Jeśli interesują Cię skrypty basha, bardzo dobrym źródłem informacji jest http://www.tldp.org/LDP/abs/abs-guide.pdf –
Dziękuję, kolego! Cóż, szczerze mówiąc, pomyślałem, że to odpowiednia część Stack Exchange, aby odpowiedzieć na tego rodzaju pytania. –
To jest właściwe miejsce. Twoje pytanie dotyczy tematu, skrypty powłoki @Patrick są jawnie [na temat] (http://unix.stackexchange.com/help/on-topic). Pytania SOFT dotyczące skryptów są bardzo łatwo zgubione w hałasie, możesz zapytać je, gdziekolwiek czujesz się bardziej komfortowo. – terdon