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 < /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
的单个调用而不是cp
和echo
单独。以上是关于LINux脚本错误返回码[重复]的主要内容,如果未能解决你的问题,请参考以下文章
调查 000 从 bash 脚本中的 cURL 返回错误代码的原因 [重复]
Linux运维之Shell编程------监控MySQL错误码及主从复制同步异常
mint linux 18.3 遇到“已安装的 post-installation 脚本 返回了错误号 127 ”问题的解决