GNU/Linux >> Tutoriales Linux >  >> Linux

archivo de creación atómica si no existe desde el script bash

Puede crearlo con un nombre generado aleatoriamente y luego cambiarle el nombre (mv -n random desired ) en su lugar con el nombre deseado. El cambio de nombre fallará si el archivo ya existe.

Así:

#!/bin/bash

touch randomFileName
mv -n randomFileName lockFile

if [ -e randomFileName ] ; then
    echo "Failed to acquired lock"
else
    echo "Acquired lock"
fi

Una solución bash 100 % pura:

set -o noclobber
{ > file ; } &> /dev/null

Este comando crea un archivo llamado file si no existe un archivo llamado file . Si hay un archivo llamado file , luego no haga nada (pero devuelva un código de retorno distinto de cero).

Los profesionales escriben el touch comando:

  • No actualiza la marca de tiempo si el archivo ya existía
  • 100 % basado en bash
  • Código de retorno como se esperaba:error si file ya existía o si file no se pudo crear; éxito si file no existió y fue creado.

Contras:

  • necesita establecer el noclobber opción (pero está bien en una secuencia de comandos, si tiene cuidado con las redirecciones o si la desactiva después).

Supongo que esta solución es realmente la contraparte bash del open llamada al sistema con O_CREAT | O_EXCL .


Aquí hay una función bash usando el mv -n truco:

function mkatomic() {
  f="$(mktemp)"
  mv -n "$f" "$1"
  if [ -e "$f" ]; then
    rm "$f"
    echo "ERROR: file exists:" "$1" >&2
    return 1
  fi
}

Ejemplos:

$ mkatomic foo
$ wc -c foo
0 foo
$ mkatomic foo
ERROR: file exists: foo

Linux
  1. Evitar que un script bash se ejecute simultáneamente

  2. ¿Se puede conectar un script Bash a un archivo?

  3. Bash Script:¿Comprobar si un archivo es un archivo de texto?

  4. Bash script:mal intérprete

  5. Abra Vim desde dentro de un script de shell Bash

35 ejemplos de secuencias de comandos Bash

¿Realizando operaciones de escritura atómica en un archivo en Bash?

Bash Script para eliminar el archivo más antiguo de una carpeta?

¿Cómo crear un archivo temporal en Shell Script?

Ejecutar script bash desde URL

bash + leer variables y valores del archivo mediante script bash