2011-11-15 11 views
14

Estoy importando un archivo a mi servidor usando este comando:Shellscript acción si dos archivos son diferentes

scp [email protected]:/test/test/test/server.py /test/test/test/test.py~/; 

deseo reiniciar mi servidor si el archivo test.py recién importado ~ difiere de la test.py eso ya existe ¿Cómo haría esto usando un shellscript?

+0

espero que quiere decir "reiniciar el demonio" no "reiniciar mi servidor" – Sorpigal

+0

Es probable que no quiere la final '/;' en ese comando, porque no es un directorio y no tiene otro comando en la misma línea. –

+0

@peter ¿quiere decir si una carga de archivos es diferente a un archivo y verifica cada uno? en tu comentario sobre mi respuesta a continuación. – gadgetmo

Respuesta

4

Puede dif() los dos archivos. Un código de retorno de cero (0) significa que no hay diferencias. Un código de retorno de uno (1) dice que los archivos son diferentes.

+1

Esto es exactamente lo que quiero hacer. De nuevo, soy novato, ¿crees que me das un ejemplo o un enlace a un ejemplo? – Spencer

+0

@peter ver mi respuesta por ejemplo/enlace. – gadgetmo

+0

¿Por qué usar diff cuando 'cmp' está diseñado para esto? – Sorpigal

42
if ! cmp test.py test.py~ >/dev/null 2>&1 
then 
    # restart service 
fi 

desglosar esos datos:

  • cmp test.py test.py~ devuelve true (0) si test.py y test.py ~ son idénticos, y false (1). Puedes ver esto en man cmp.
  • ! invierte ese resultado, por lo que la instrucción if se traduce como "si test.py y test.py ~ son diferentes".
  • Los redireccionamientos >/dev/null 2>&1 envían todos los resultados de cmp a null device, por lo que solo obtendrá el resultado de comparación verdadero/falso, sin ningún ruido no deseado en la consola.
+0

+1, pero -q no es estándar. Redirigir a/dev/null siempre funcionará. –

+0

Disculpe, ¿podría alguien explicar la primera línea para un principiante bash? ¿Cuál es la precedencia para el argumento del operador if? ¿Por qué hay esos dos redireccionamientos y qué significan? – user1512321

+0

@AndrewSchulman: Gracias, lo usé en un guión. Si entiendo esto, tanto la salida booleana como la salida estándar se envían al if, de manera que para tener la respuesta booleana, debe enviar el stdout al bit bucket. – user1512321

0

me gustaría hacer algo como

[email protected]$ cat /test/test/test/server.py | ssh [email protected] 'cat - > /test/test/test/test.py.new ; cmp /test/test/test/test.py /test/test/test/test.py.new || (mv /test/test/test/test.py.new /test/test/test/test.py ; echo issue restart command here)' 
Cuestiones relacionadas