salir de un comando bash en un script sin salir del script

salir de un comando bash en un script sin salir del script

Estoy trabajando en un script que busca una carpeta de tarea (los archivos de origen) y, si la carpeta existe, busca una carpeta de destino. Si esa carpeta no existe, copia el origen al destino.

Si el destino existe, intenta copiar el archivo desde el origen al destino y antes de hacerlo, primero avisa al usuario para que no sobrescriba el trabajo ya realizado por ese usuario.

La salida del comando debe estar en un formato específico, por lo que no puedo usar la salida estándar del comando tal como está. Debo capturarlo y reformatearlo. Luego tome la entrada (es decir, sí/no) en un formato específico.

El beneficio de hacer esto es que el comando copiar ya hace cosas que son útiles. Si un archivo no existe, hace la copia.

Si ya existe uno o varios archivos, preguntará repetidamente "¿sobrescribir y/n?" Es este caso el que estoy tratando de abordar.

Llegué tan lejos como para capturar la salida del comando de copia en una variable y suprimir su salida normal para poder reformatear su salida y hacer eco de ese formato al usuario.

A continuación, pienso que necesito eliminar (o detener el comando de alguna manera), luego imprimir la salida en el formato deseado y luego volver a invocar el comando y, la segunda vez, puedo repetir el mensaje y/N en mi formato deseado y el usuario puede entonces hacer su elección. A pesar de la búsqueda, no he podido descubrir ni entender cómo eliminar o detener el comando una vez que se invoca. Intenté matar y varios intentos de usar SIGINT. O simplemente no entiendo cómo usarlos o no son la opción correcta. Cuando intento usarlos, aparece un error de sintaxis.

Aquí está mi código:

#!/bin/bash

USAGE="Usage: ./script2.sh [hw-name]"
EINVALID="Invalid homework: $1"
SOURCEDIRECTORY="$PUBLIC/homework/$1"
HOMEWORKDIRECTORY="$HOME/homework/$1"
COPY="$SOURCEDIRECTORY/*.*"

if [ -z "$1" ]; then
    echo $USAGE
    exit
fi

if [ ! -d "$SOURCEDIRECTORY" ]; then
    echo $EINVALID
    exit
fi

if [ ! -d "$HOMEWORKDIRECTORY" ]; then
    echo "making homework1"
    mkdir -p $HOMEWORKDIRECTORY

copyOutput2="$(eval cp -ir $COPY $HOMEWORKDIRECTORY 2>&1 &stop this
 process somehow)"
echo $copyOutput2 #temporary output for testing

Respuesta1

Si uno realmente necesita tener cpun mensaje personalizado, entonces recompilar el programa desde la fuente es el camino a seguir, pero un enfoque un poco más sensato sería escribir su propio mensaje preferiblemente printf, en lugar de intentar interceptar cpla salida. y manejar las opciones del usuario a través selectdel diálogo. Además, si va a generar mensajes de error, deben transmitirse stderr. Finalmente, *.*es innecesario y puedes usar *glob en su lugar.

A continuación se muestra el guión con un par de ediciones. Tenga en cuenta que debe descomentar #cp "$item" "$HOMEWORKDIRECTORY"la línea para que se realice la copia real. Para fines de prueba, reemplácelo cpcon echoprimero.

#!/bin/bash

USAGE="Usage: ./script2.sh [hw-name]"
EINVALID="Invalid homework: $1"
SOURCEDIRECTORY="$PUBLIC/homework/$1"
HOMEWORKDIRECTORY="$HOME/homework/$1"
#COPY="$SOURCEDIRECTORY/*.*"

if [ -z "$1" ]; then
    echo "$USAGE" > /dev/stderr
    exit 1
fi

if [ ! -d "$SOURCEDIRECTORY" ]; then
    echo "$EINVALID" > /dev/stderr
    exit 2
fi

if [ ! -d "$HOMEWORKDIRECTORY" ]; then
    echo "making homework1"
    mkdir -p $HOMEWORKDIRECTORY

for item in "$SOURCEDIRECTORY"/*; do
    skip=true
    if [ -f "$HOMEWORKDIRECTORY"/"${item##*/}" ]; then
        printf "%s already exists in %s.\n" "$item" "$HOMEWORKDIRECTORY"

        select choice in  "overwrite" "skip"; do
            case "$choice" in 
                "overwrite")  echo "Overwriting."  
                              break;;
                "skip") skip=true; break;;
            esac
        done
    fi

    if [ "$skip" = "true" ]; then
        continue
    fi
    echo cp "$item" "$HOMEWORKDIRECTORY"

done

información relacionada