Mientras bucle hasta que exista un archivo en bash

0

Quiero escribir waithasta que exista un archivo en bash. ¿Cómo hago esto?

Intenté esto pero no funciona:

while [ ! -f outputs\/$trace\_hist_len_$hist_len\_page_size_$page_size\.out]; do
echo "waiting for outputs\/$trace\_hist_len_$hist_len\_page_size_$page_size\.out";
done

Parece tener un error de sintaxis.

SurenNihalani
fuente
De acuerdo, su formato probablemente ya no se vea bien después de sangrar el código, lo siento. ¿Puedes verificar si tus variables se ven bien? Y en el futuro, sangra el código con 4 espacios más o Ctrl-Kmenos para que no tengas que escapar de nada.
slhck
Sí, es correcto Gracias por el formateo.
SurenNihalani
1
Por favor, publique el resto de su código también. ¿Cuáles son los valores de $trace, $hist_leny $page_size? ¿Cuál es el error que estás recibiendo? ¿Por qué necesitas escapar del /?
Ansgar Wiechers
waitprobablemente no sea el comando que estás buscando. waitpausará una secuencia de comandos hasta que todos los procesos secundarios finalicen, en cuyo punto continuará.
UtahJarhead
Creo que tienes tu / y \ mezclado. Los nombres de ruta en bash (incluso en cygwin) usan el carácter / como delimitador.
UtahJarhead

Respuestas:

8
mientras : ; hacer
    [[-f "/ ruta / a / archivo"]] && break
    echo "Pausa hasta que exista el archivo".
    dormir 1
hecho

Sin usar algo como inotifyesto, se trata del límite de lo que vas a poder hacer.

El whilebucle anterior solo se usa :como condicional, lo que prácticamente significa "hacerlo hasta que lo matemos".

La línea importante es la [[prueba. La prueba condicional aquí no usa la ifdeclaración. Esto se debe a que [[es un comando real y NO parte de la ifdeclaración. Esto se ejecuta [[ -f "/path/to/file" ]]y &&comprueba el estado de salida del [[comando y ejecuta la siguiente instrucción si ese estado de salida es 0(correcto). La siguiente declaración aquí es la breakque cerrará el ciclo actual en el que se encuentra su script.

Nota: bashes muy recomendable que lo uses en [[lugar de [. Tiene todas las capacidades, [pero es mucho más potente y fácil de usar.

UtahJarhead
fuente
1
No hay nada malo con mientras [! -f "ruta"]; echo lo que sea; hecho De hecho, creo que tu ejemplo es tonto porque puedes hacerlo: mientras que [[! -f ruta]]; do echo tonto; hecho Además, la pregunta era sobre un error de sintaxis, y no sobre evitarlo con construcciones de bash "altamente recomendadas" y menos portátiles .
Ярослав Рахматуллин
No, la pregunta era cómo puede realizar una tarea específica y que su único intento había fallado. Me preguntó cómo podía lograr la tarea, yo respondí la pregunta. Si no es el mejor método para obtener los resultados, los votos lo reflejarán. Estás en lo correcto, usando la sintaxis que indicaste es perfectamente válida. Sin embargo, al usar [[y simplemente citar su nombre de archivo, es probable que sea interpretado de manera más apropiada por la [[cual es una de las razones por las que se recomienda [.
UtahJarhead
Cita: Quiero escribir esperar hasta que exista un archivo en bash. ¿Cómo hago esto?
UtahJarhead
Quieres decir que tu voto reflejará eso. Su bucle es válido con la excepción de un carácter de espacio faltante.
Ярослав Рахматуллин
No puedes votar por tus propias respuestas. Buen intento.
UtahJarhead
4

El espacio entre el argumento del archivo y el corchete de cierre es importante.

if [ -f "path" ]; then echo good;fi

if [-f "path"] ; then  echo bad;fi
if [ -f "path"]; then  echo bad;fi
if [-f "path" ]; then  echo bad;fi
Ярослав Рахматуллин
fuente