¿Cómo hacer que una secuencia de comandos launchd cree un archivo con marca de tiempo?

1

Estoy intentando ejecutar una secuencia de comandos simple de launchd que copia un archivo de un directorio a otro cuando el archivo cambia, pero quiero pegarlo con una marca de tiempo única para poder versionar los archivos. Mi script de launchd tiene el siguiente aspecto:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>change.file.copy</string>
    <key>ProgramArguments</key>
    <array>
        <string>cp</string>
        <string>/path/to/folder/sample_file.txt</string>
        <string>/path/to/another_folder/$(gdate +%Y%m%d_%T.%N)_sample_file.txt</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/path/to/folder/sample_file.txt</string>
    </array>
</dict>
</plist>

El comando funciona perfectamente bien si lo ejecuto a través de la Terminal, es decir, si ejecuto:

cp /path/to/folder/sample_file.txt /path/to/another_folder/$(gdate +%Y%m%d_%T.%N)_sample_file.txt

Sin embargo, cada vez que el evento lo activa, en su lugar crea un archivo con una cadena (gdate +% Y% m% d_% T.% N) en lugar de la fecha real, es decir, el operador de la fecha no se resuelve cuando se ejecuta a través de launchd.

Siempre podría crear un ejecutable y ejecutarlo a través de launchd pero me preguntaba por qué lo anterior no funciona correctamente.

¡Gracias por la ayuda!

philosopher
fuente

Respuestas:

1

Aquí está la solución. Buscar con las palabras clave adecuadas en Google es todo.

<key>ProgramArguments</key>
<array>
    <string>bash</string>
    <string>-c</string>
    <string>cp /path/to/folder/sample.txt /path_to_another_folder/$(/usr/local/bin/gdate +%Y%m%d_%T.%N)_sample.txt</string>
</array>
philosopher
fuente