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ć testze 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 gnuplotmogę 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 testi $?:
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 lsmoż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"?