Non riesci a trovare il motivo per cui il mio script bash sta uscendo dopo l'accesso negato
-
02-10-2019 - |
Domanda
ho una parte del mio script che fa questo:
- rimuove tutto nella directory
- Forza sincronizza dal necessariamente quella directory
- 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.
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"