Parece que você precisa do status de saída invertido, então você pode fazer:
system("[ ! -e file ]; echo $?")
ou:
system("[ -e file ]; echo $((!$?))")
(observe que -f
é para se o arquivo existir e é um arquivo regular ).
Espero que seja bom anotar isso, agora que encontrei:
Eu já sei que é possível testar a existência de arquivos usando o comando 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
... mas isso é um pouco de digitação lá :)
Então, eu estava vagando se houvesse um único comando "padrão", que retornaria o resultado da existência do arquivo para stdout
?
Eu também posso usar test
com o status de saída $?
:
$ test -f exists.file ; echo $?
0
$ test -f noexists.file ; echo $?
1
... mas isso ainda é dois comandos - e a lógica também é "inversa" (0 para sucesso e diferente de zero para falha).
O motivo pelo qual estou perguntando é que preciso testar a existência de arquivos em gnuplot
, cujo " system("command")
retorna o caractere resultante
fluxo de stdout como uma string. "; em gnuplot
posso fazer diretamente:
gnuplot> if (0) { print "yes" } else { print "no" }
no
gnuplot> if (1) { print "yes" } else { print "no" }
yes
então eu basicamente gostaria de poder escrever algo assim (pseudo):
gnuplot> file_exists = system("check_file --stdout exists.file")
gnuplot> if (file_exists) { print "yes" } else { print "no" }
yes
... infelizmente, não consigo usar isso diretamente por meio de test
e $?
:
gnuplot> file_exists = system("test -f exists.file; echo $?")
gnuplot> if (file_exists) { print "yes" } else { print "no" }
no
... eu teria que inverter a lógica.
Então, eu basicamente teria que criar uma solução de script personalizada (ou escrever um script em linha como uma linha) ... e pensei, se já existe um comando padrão que pode imprimir 0 ou 1 (ou uma mensagem personalizada) para stdout para existência de arquivo, então eu não tenho que fazer isso :)
(note que ls
pode ser um candidato, mas sua saída stdout é muito detalhada; e se eu quiser evitar isso, eu teria que suprimir todas as saídas e retornar novamente o status, como em
$ ls exists.file 1>/dev/null 2>/dev/null ; echo $?
0
$ ls noexists.file 1>/dev/null 2>/dev/null ; echo $?
2
... mas isso é novamente dois comandos (e mais digitação) e lógica "invertida" ...)
Então, existe um único comando padrão que pode fazer isso no Linux?
Parece que você precisa do status de saída invertido, então você pode fazer:
system("[ ! -e file ]; echo $?")
ou:
system("[ -e file ]; echo $((!$?))")
(observe que -f
é para se o arquivo existir e é um arquivo regular ).
Use este comando bash único:
[ -f /home/user/file_name ]
O []
executa o teste e retorna 0 no sucesso
Que tal "inverter a lógica" por:
file_exists = 1-system("test -f exists.file; echo $?")
Isso funciona:
pwsh -c Test-Path /etc/passwd
... se você tiver o PowerShell instalado. Ele retorna a string "True", se o caminho existir, ou "False" se não existir. (Recebo pontos "sarcasticamente inúteis" para esta resposta?)