Non riesci a trovare il motivo per cui il mio script bash sta uscendo dopo l'accesso negato

StackOverflow https://stackoverflow.com/questions/3681971

  •  02-10-2019
  •  | 
  •  

Domanda

ho una parte del mio script che fa questo:

  1. rimuove tutto nella directory
  2. Forza sincronizza dal necessariamente quella directory
  3. copia i file da un altro elenco di detto elenco, di cui ci sono alcuni conflitti che il controllo del codice sorgente impedisce di essere sovrascritti (che è prevedibile e quello che voglio)

Prima avrei proprio questo:

...
cp <source path> <dest path>
echo done copying
...
echo done

Output:

...
Permission Denied:file1
Permission Denied:file2
done copying
...
done

Quindi, sarebbe fare le cose, e raggiungono fatto. Poi, sono andato e ha fatto una sorta di controllo per assicurarsi che le uscite di directory in questo modo:

if[ -d sourcepath ]
      then 
       if [ -d destpath ]
           then
              cp <source path> <dest path>
           else
              echo problem with dest
              exit 1
        fi
    else
        problem with source
       exit 1
fi

Ma ora lo script esce subito dopo l'ultimo del permesso Nega, non colpire nulla dopo, quindi l'uscita è in questo modo:

Output:

...
Permission Denied:file1
Permission Denied:file2

Non sono troppo esperto nelle regole bash, così ho pensato che avrei posto questa domanda qui dato che non riuscivo a trovarlo. Sembra che nel caso, però, il fatto che ci sono problemi di permesso indurlo a uscire.

È stato utile?

Soluzione

Oltre a errori di sintassi presumibilmente introdotti durante cut'n'paste qui, non c'è niente di sbagliato in questo codice, come dimostra il seguente esperimento:

#!/bin/bash

rm -rf sourcepath destpath
mkdir sourcepath
mkdir destpath
touch sourcepath/xyz
touch destpath/xyz
chmod 000 destpath/xyz

if [ -d sourcepath ]
      then
       if [ -d destpath ]
           then
              cp sourcepath/xyz destpath/xyz
           else
              echo problem with dest
              exit 1
        fi
    else
       echo problem with source
       exit 1
fi
echo Woohoo!

Quando viene eseguito, questo uscite:

cp: cannot create regular file `destpath/xyz': Permission denied
Woohoo!

in modo da vedere è portare avanti dopo il fallimento.

Un consiglio prezioso: quando si è il debug degli script bash, inserire la riga:

set -x

fino in cima (dopo #!/bin/bash se c'è). Questo farà sì che l'uscita ogni comando prima di eseguirlo.

In realtà, ho sempre ragione i miei script inizia con:

#!/bin/bash
#set -x

quindi posso solo rimuovere il commento dalla seconda linea per il debug.

Per inciso, vorrei codice che, come:

if [[ ! -d sourcepath ]] ; then
    problem with source
    exit 1
fi
if [[ ! -d destpath ]] ; then
    problem with dest
    exit 1
fi
cp <source path> <dest path>

ma questo è solo perché non mi piace costrutti if-then-else complicate.

Altri suggerimenti

si controlla i permessi di scrittura

test -w / && echo "writable" 
test -w ~ && echo "writable" 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top