我正在编写一个脚本,它将接收3个输出,然后搜索预定义路径中的所有文件。但是,我的grep
命令似乎打破了错误代码123的脚本。我一直盯着它看似错误,所以我希望有人可以指出我的错误。这是代码:
#! /bin/bash -e
#Check if path exists
if [ -z $ARCHIVE ]; then
echo "ARCHIVE NOT SET, PLEASE SET TO PROCEED."
echo "EXITING...."
exit 1
elif [ $# -ne 3 ]; then
echo "Illegal number of arguments"
echo "Please enter the date in yyyy mm dd"
echo "EXITING..."
exit 1
fi
filename=output.txt
#Simple signal handler
signal_handler()
{
echo ""
echo "Process killed or interrupted"
echo "Cleaning up files..."
rm -f out
echo "Finsihed"
exit 1
}
trap 'signal_handler' KILL
trap 'signal_handler' TERM
trap 'signal_handler' INT
echo "line 32"
echo $1 $2 $3
#Search for the TimeStamp field and replace the / and : characters
find $ARCHIVE | xargs grep -l "TimeStamp: $2/$3/$1"
echo "line 35"
fileSize=`wc -c out.txt | cut -f 1 -d ' '`
echo $fileSize
if [ $fileSize -ge 1 ]; then
echo "no"
xargs -n1 basename < $filename
else
echo "NO FILES EXIST"
fi
我添加了回声来知道它在哪里破碎。我的程序打印出第32行和args但从不打35行。当我检查退出代码时,我得到123.
谢谢!
注意:
ARCHIVE设置为测试目录,即/home/'uname'/testDir
$ 1 $ 2 $ 3 == yyyy mm dd(即日期)
在testDir中有N个目录。在这些目录中,有包含数据的数据文件以及时间标记。时间标记的格式如下:TimeStamp: 02/02/2004 at 20:38:01
脚本目标是查找具有您要搜索的日期标记的所有文件。
答案 0 :(得分:3)
这是一个更简单的测试用例,可以演示您的问题:
#!/bin/bash -e
echo "This prints"
true | xargs false
echo "This does not"
该代码段以代码123退出。
如果任何命令失败,问题是xargs
退出代码123
。当xargs以非零状态退出时,-e
会导致脚本退出。
最快的解决方法是使用|| true
有效忽略xargs
&#39;状态:
#!/bin/bash -e
echo "This prints"
true | xargs false || true
echo "This now prints too"
更好的解决方法是不依赖-e
,因为此选项具有误导性和不可预测性。
答案 1 :(得分:1)
xargs
返回非零代码时, 123
会生成错误代码grep
。由于您正在使用-e
(#!/bin/bash -e
),bash
会在其中一个命令返回非零退出代码时退出脚本。不使用-e
将允许您的代码继续。只是在那部分禁用它也可以是一个解决方案:
set +e ## Disable
find "$ARCHIVE" | xargs grep -l "TimeStamp: $2/$1/$3" ## If one of the files doesn't match the pattern, `grep` would return a nonzero code.
set -e ## Enable again.
考虑将变量放在引号周围以防止分词,例如"$ARCHIVE"
。
-d '\n'
filename包含空格。
find "$ARCHIVE" | xargs -d '\n' grep -l "TimeStamp: $2/$1/$3"