アクセスが拒否された後に私のbashスクリプトが終了している理由がわからない

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

  •  02-10-2019
  •  | 
  •  

質問

私はこれを行うスクリプトの一部を持っています:

  1. ディレクトリ内のすべてを削除します
  2. そのディレクトリのPerforceからの力の同期
  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

私はバッシュのルールにあまり精通していないので、私はそれを見つけられなかったので、ここにこの質問を投稿すると思いました。しかし、IFでは、許可の問題があるという事実により、それが終了するようです。

役に立ちましたか?

解決

ここで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

したがって、デバッグの目的で2行目を除外することができます。

余談ですが、私はそれを次のようにコーディングします。

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 コンストラクト。

他のヒント

書き込み許可を確認する必要があります

test -w / && echo "writable" 
test -w ~ && echo "writable" 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top