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 cp
funciona 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 -e
pruebas para un archivo decualquier tipo.test -e
o 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,Settings
en 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
if
Aunque no es necesario. GNU cp
con -n
( --no-clobber
) puede ser todo lo que necesita en lugar del if … fi
suyo. 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 if
de todos modos.