2014-06-16 77 views
1

我有下面的代码..的Linux脚本错误返回代码

while read copy 
do 
    cp -v $copy | tee -a $LOGFILE 
    echo $? 
    if [[ $? -ne 0 ]] 
     then 
     echo "Error copying files. Exiting ..." | tee -a $LOGFILE 
     exit 1 
    fi 

done < copy_new_files.tmp 

..我想脚本停止,如果一个文件不能被复制的错误,如拒绝的权限。

从脚本的输出不产生对被拒绝的错误权限错误代码..

+ read copy 
+ cp -v acts035.fmt /home/test/gp/efin/source/pl/acts035.fmt 
cp: cannot create regular file `/home/test/gp/efin/source/pl/acts035.fmt': Permission denied 
+ tee -a /home/test/gp/efin/fixes/12345/efin_fix_copy_12345.log 
`acts035.fmt' -> `/home/test/gp/efin/source/pl/acts035.fmt' 
+ echo 0 
0 

我怎样才能拿到剧本暂停,如果有一个错误?

非常感谢。

+0

这'权限denied'提示你没有权限在日志文件中写入。 – fedorqui

+1

使用'$?'两次看起来很可疑。 'echo $?'改变它。也许你应该在使用它之前存储这个值。 – andrjas

+1

如果您需要在交互式模式下的暂停这足以写的,而不是'出口1'像'读ppppp'线。当你想要前进时按回车 – Hastur

回答

3

有些阴险的小东西,我希望不会过长:

  • 第一个问题是,$?返回上次退出错误代码
    因此,当您在以下行中执行echo $?时,您将$?设置为新值,0在这种情况下:我看不到任何原因,echo命令必须失败。

  • 第二个更隐患的问题是先例命令是管道。所以要使用的变量是${PIPESTATUS[0]}而不是$?。 (有[0],因为它是一个数组,我们希望存储在第一个组件中的值是第一个命令的退出状态)。
    您可以再次将变量存储在此值中,或者您可以在测试后立即执行。否则,使用其他命令将再次重置变量值。

  • 要暂停脚本的执行,它应该足以写入输入行,如read -p x < /dev/tty。这次是阴险的标准输入冲洗,我们克服了从tty要求输入。

  • 使用read -rread通常更安全。

    -r原始输入 - 禁用反斜线的解释逃脱并且行继续在读取数据

所以代码变体应该是:

while read -r copy 
do 
    cp -v $copy | tee -a $LOGFILE 
    # echo $? ${PIPESTATUS[0]}    # NOT HERE else you loose it 
    if [[ ${PIPESTATUS[0]} -ne 0 ]]  # $? was referred to the last command. 
     then        # Use ${PIPESTATUS[0]} instead 
     echo "Error copying files. ${copy} Exiting ..." | tee -a $LOGFILE 
              # It will wait that you press return 
     read -p "Press CTRL-C to interrupt, RETURN to continue " x < /dev/tty 
     # exit 1       # It will not exit: (#) means comment. 
    fi 
done < copy_new_files.tmp 

注意:如chepner建议捕获cp退出状态的问题也可以通过将while循环的标准输出管道化为单个ca来解决11到tee,而不是cpecho单独,这是更加优雅。当然在这种情况下,你会在输出文件中写出周期中打印的所有文本,而,甚至不需要“按CTRL-C中断,返回继续”我添加的行。

+1

不需要“aaaaa”。 'read'已经有一个默认的变量'$ REPLY',所以如果你不使用的变量可能也只是写'read' –

+0

谢谢,这是正确的像太阳一样照耀:-)。我的目的是保持该值跳过暂停或在下次发现错误时直接退出。还有另外几件事要解决,我等着他发布源文件的一些行。 – Hastur

+1

捕获'cp'的退出状态的问题也可以通过将'while'循环的标准输出单独调用到'tee'而不是'cp'和'echo'来修复。 – chepner