0

これを行うスクリプトの一部があります。

  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 Denies の後に終了するだけで、その後は何もヒットしないため、出力は次のようになります。

出力:

...
Permission Denied:file1
Permission Denied:file2

私は bash のルールにあまり詳しくないので、この質問を見つけることができなかったので、ここに投稿すると思いました。ただし、if では、許可の問題があるという事実により終了するようです。

4

2 に答える 2

4

次の実験で示されているように、ここでカットアンドペースト中に導入されたと思われる構文エラーを除いて、そのコードには何も問題はありません。

#!/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貴重なアドバイスの 1 つ:スクリプトをデバッグするときは、次の行を入力します。

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

于 2010-09-10T02:50:39.120 に答える
0

書き込み権限を確認する必要があります

test -w / && echo "writable" 
test -w ~ && echo "writable" 
于 2010-09-10T02:54:27.600 に答える