LINux脚本错误返回码[重复]

Posted

技术标签:

【中文标题】LINux脚本错误返回码[重复]【英文标题】:LInux script error return codes [duplicate] 【发布时间】:2014-08-06 05:32:12 【问题描述】:

我有以下代码..

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

如果出现错误,如何让脚本暂停?

非常感谢。

【问题讨论】:

这个Permission denied 表明你没有写入日志文件的权限。 使用$? 两次看起来很可疑。 echo $? 改变它。也许您应该在使用之前存储该值。 如果您需要在交互模式下暂停,只需编写 exit 1 而不是 read ppppp 之类的行。当你想前进时按回车 请发一些来自copy_new_files.tmp的行。 您发布的脚本没有产生您发布的错误消息。您发布的脚本将有 cp 抱怨没有足够的参数 - 它至少需要两个,而您只给了它一个。 【参考方案1】:

一些阴险的小事,希望不要过长:

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

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

要暂停脚本的执行,只需编写一个输入行,如read -p x &lt; /dev/tty。这次要阴险的是我们克服了向tty 询问输入的标准输入刷新

使用read -r 通常比使用read 更安全。

-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 循环的标准输出传递到对 tee 的单个调用而不是 @987654336 来解决@ 和 echo 单独,那就更优雅了。当然在这种情况下你会在输出文件中写入所有在循环中打印的文本,甚至是不需要的“Press CTRL-C to interrupt, RETURN to continue” em> 我添加的行。

【讨论】:

不需要“aaaaa”。 read已经有一个默认变量$REPLY,所以如果你不使用这个变量还不如写read 谢谢,就像阳光普照一样:-)。我的目的是保留该值以跳过暂停或在下次发现错误时直接退出。还有几件事要解决,我在等他发布源文件的一些行。 捕获cp 的退出状态的问题也可以通过将while 循环的标准输出传递到对tee 的单个调用而不是cpecho 单独。

以上是关于LINux脚本错误返回码[重复]的主要内容,如果未能解决你的问题,请参考以下文章

调查 000 从 bash 脚本中的 cURL 返回错误代码的原因 [重复]

如何在shell脚本中,判断一个基本命令执行是不是成功

Shell命令的退出状态及错误检查

Linux运维之Shell编程------监控MySQL错误码及主从复制同步异常

mint linux 18.3 遇到“已安装的 post-installation 脚本 返回了错误号 127 ”问题的解决

linux 批量测试域名返回码脚本