Не могу узнать, почему мой bash-скрипт завершает работу после отказа в доступе - PullRequest
0 голосов
/ 10 сентября 2010

У меня есть часть моего скрипта, которая делает это:

  1. Удаляет все в каталоге
  2. Принудительная синхронизация из этого каталога
  3. копирует файлы из другого каталога в указанный каталог, из-за чего существуют некоторые конфликты, которые исходный элемент управления не позволяет перезаписать (что ожидаемо и что я хочу)

Прежде, чем я получил бы только это:

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

Выход:

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

Так что, он сделал бы все, и достичь готово. Затем я пошел и сделал своего рода проверку, чтобы убедиться, что каталог завершился следующим образом:

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

Но теперь сценарий просто завершается после последнего отказа в разрешении, после чего ничего не происходит, поэтому вывод выглядит так:

Выход:

...
Permission Denied:file1
Permission Denied:file2

Я не слишком разбираюсь в правилах bash, поэтому я просто подумал, что опубликую этот вопрос здесь, так как не смог его найти. Похоже, что в том случае, если из-за проблем с разрешением он завершается.

Ответы [ 2 ]

4 голосов
/ 10 сентября 2010

Кроме синтаксических ошибок, предположительно внесенных здесь во время cut'n'paste, в этом коде нет ничего плохого, как показано в следующем эксперименте:

#!/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!

При запуске выдается:

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

, чтобы вы могли видеть, что он продолжает работать после сбоя.

Один бесценный совет: когда вы отлаживаете bash сценариев, поставьте строку:

set -x

прямо вверх (после #!/bin/bash, если он там есть).Это приведет к выводу каждой команды перед ее выполнением.

На самом деле я всегда корректирую свои сценарии, начиная с:

#!/bin/bash
#set -x

, поэтому я могу просто раскомментировать вторую строку для целей отладки.

Кроме того, я бы закодировал это как:

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>

, но это только потому, что я не люблю сложные if-then-else конструкции.

0 голосов
/ 10 сентября 2010

вы должны проверить права на запись

test -w / && echo "writable" 
test -w ~ && echo "writable" 
...