我正在编写一个shell脚本,该脚本将被赋予一个目录,然后输出该目录的ls,其中包含来自附加到每一行的C程序的返回码。只需要为常规文件调用C程序。
我遇到的问题是来自C程序的输出混乱了awk的输出,我无法将stdout重定向到awk内的/ dev / null。我没有输出,我只需要返回代码。速度绝对是一个因素,所以如果你有一个更有效的解决方案,我会很高兴听到它。代码如下:
directory=$1
ls -i --full-time $directory | awk '
{
rc = 0
if (substr($2,1,1) == "-") {
dbType=system("cprogram '$directory'/"$10)
}
print $0 " " rc
}
'
答案 0 :(得分:1)
awk不是shell所以你不能在awk脚本中使用shell变量,而在shell中总是引用你的变量。试试这个:
directory="$1"
ls -i --full-time "$directory" | awk -v dir="$directory" '
{
rc = 0
if (substr($2,1,1) == "-") {
rc = system("cprogram \"" dir "/" $10 "\" >/dev/null")
}
print $0, rc
}
'
哦,当然,实际上并没有这样做。请参阅http://mywiki.wooledge.org/ParsingLs。
我只花了一分钟思考你的脚本实际在做什么,而不是尝试使用awk作为shell并解析ls的输出,看起来你真正想要的解决方案更像是:
directory="$1"
find "$directory" -type f -maxdepth 1 -print |
while IFS= read -r dirFile
do
op=$(ls -i --full-time "$dirFile")
cprogram "$dirFile" >/dev/null
rc="$?"
printf "%s %s\n" "$op" "$rc"
done
并且您可以使用-printf
的{{1}} arg保存一个步骤,以获取您当前使用find
的任何信息。