Copiar archivo por variable si aún no está presente

Copiar archivo por variable si aún no está presente

Estoy creando un script de shell de plantilla para un proyecto, una función imprescindible es la capacidad de hacer una copia de un archivo de configuración de plantilla como un archivo nuevo. Sin embargo, esto no se manejará estáticamente, creo y configuro una variable de tiempo de ejecución.( $modloader)que proviene del nombre del archivo de scripts de shell y copia la plantilla con este mismo nombre. Hice algunas pruebas con nombres de archivos estáticos y cpfunciona bien, pero parece desmoronarse al comprobar si el archivo ya está presente.(línea 5). Si ejecuto esto en la terminal, no ve el archivo que está buscando. Creo que lo busca en un contexto más literal y no'entender'está usando una variable.

#!/bin/sh

modloader=`basename -s .sh "$0"`

if "./Settings/$modloader.ini"; then
    cp "./Settings/Template.ini" "./Settings/$modloader.ini"
fi

Respuesta1

parece desmoronarse al comprobar si el archivo ya está presente

No veo que estés comprobando si el archivo ya está presente. Tus if "./Settings/$modloader.ini";intentos decorrerel archivo ini. En general, puede ser una prueba válida para algo, si el archivo está diseñado para ejecutarse así y devolver el estado de salida de acuerdo con lo que desea probar.

Incluso si fuera posible ejecutar el archivo en cuestión, no tendría sentido convertirlo en un probador de su propia (no)existencia.

La forma correcta en un shell de saber si el archivo existe es:

test -e "./Settings/$modloader.ini"
# or equivalently
[ -e "./Settings/$modloader.ini" ]

Notas:

  • test -epruebas para un archivo decualquier tipo.
  • test -eo algo así le dará un falso negativo (es decir, un estado de salida distinto de cero) si los permisos para algún directorio relevante (por ejemplo, Settingsen su caso) no permiten verificar si el archivo existe.

Además desea negar la prueba. La línea en su código sería como:

if ! [ -e "./Settings/$modloader.ini" ]; then

ifAunque no es necesario. GNU cpcon -n( --no-clobber) puede ser todo lo que necesita en lugar del if … fisuyo. La opción no es portátil y lo más probable es que desee otra opción no portátil -T( --no-target-directory) en caso de que el destino resulte ser (un enlace simbólico a) un directorio.

cp -nT "./Settings/Template.ini" "./Settings/$modloader.ini"

Tenga en cuenta que si el objetivo ya existe y, por lo tanto cp -n, no es operativo, el estado de salida será 0. Obtendrá el mismo estado de salida si el destino no existe y la copia se realiza correctamente. Esto significa que si desea hacer más (que cp) dependiendo de si el archivo existió o no, necesitará hacerlo previamente ifde todos modos.

información relacionada