Mam nadzieję, że dobrze jest to zanotować, skoro już się z tym spotkałem:
Wiem już, że można przetestować istnienie pliku za pomocą polecenia test
( [
):
$ touch exists.file
$ if [ -f exists.file ] ; then echo "yes" ; else echo "no" ; fi
yes
$ if [ -f noexists.file ] ; then echo "yes" ; else echo "no" ; fi
no
... ale to trochę tam pisać :)
Więc wędrowałem, czy istnieje "domyślne" pojedyncze polecenie, które zwróci wynik istnienia pliku stdout
?
Mogę również użyć test
ze statusem wyjścia $?
:
$ test -f exists.file ; echo $?
0
$ test -f noexists.file ; echo $?
1
... ale wciąż są to dwa polecenia - a logika jest również „odwrotna” (0 dla sukcesu, a niezerowa dla niepowodzenia).
Powodem, dla którego pytam, jest to, że muszę przetestować istnienie pliku gnuplot
, którego „ system("command")
zwraca wynikowy strumień znaków ze standardowego wyjścia jako ciąg. ”; w gnuplot
mogę zrobić bezpośrednio:
gnuplot> if (0) { print "yes" } else { print "no" }
no
gnuplot> if (1) { print "yes" } else { print "no" }
yes
więc zasadniczo chciałbym móc napisać coś takiego (pseudo):
gnuplot> file_exists = system("check_file --stdout exists.file")
gnuplot> if (file_exists) { print "yes" } else { print "no" }
yes
... niestety, nie mogę używać, bezpośrednio poprzez test
i $?
:
gnuplot> file_exists = system("test -f exists.file; echo $?")
gnuplot> if (file_exists) { print "yes" } else { print "no" }
no
... musiałbym odwrócić logikę.
Więc w zasadzie musiałbym wymyślić coś w rodzaju niestandardowego rozwiązania skryptu (lub napisać skrypt w jednym wierszu) ... i pomyślałem, że jeśli jest już domyślne polecenie, które może wypisać 0 lub 1 (lub niestandardowy komunikat) na standardowe wyjście dla istnienia pliku, wtedy nie muszę tego robić :)
(zwróć uwagę, że ls
może to być kandydat, ale jego wyjście standardowe jest zdecydowanie zbyt szczegółowe; a jeśli chcę tego uniknąć, musiałbym stłumić wszystkie dane wyjściowe i ponownie zwrócić status istnienia, jak w
$ ls exists.file 1>/dev/null 2>/dev/null ; echo $?
0
$ ls noexists.file 1>/dev/null 2>/dev/null ; echo $?
2
... ale to znowu dwa polecenia (i więcej pisania) i logika „odwrócona” ...)
Czy istnieje więc jedna domyślna komenda, która może to zrobić w systemie Linux?
( [ -f py_concur.py ] && echo "file exists" ) || echo "file does not exist"
?