Bash 在shell脚本中使用awk-v时出现Fork重试错误

Bash 在shell脚本中使用awk-v时出现Fork重试错误,bash,awk,sh,Bash,Awk,Sh,当我运行脚本时 #!/bin/sh input1=$1 input2=$2 awk -v FILEIN=$(echo $input1) ' NR==FNR { a[$1]=$2; next } { if ($19 < $20) print $0, substr(a[FILEIN],$19,$5) ; else print $0, substr(a[FILEIN],$2

当我运行脚本时

#!/bin/sh

input1=$1
input2=$2

awk -v FILEIN=$(echo $input1) '

NR==FNR { 
        a[$1]=$2; 
        next
        } {
        if ($19 < $20) 
                print $0, substr(a[FILEIN],$19,$5) ;
        else print $0, substr(a[FILEIN],$20,$5)}' $input2 $input1
有时会出现错误:“script.sh:fork:retry:Resource暂时不可用”

如果我避免传递shell变量并显式地声明FILEIN(这是不切实际的)

#/垃圾箱/垃圾箱
输入1=$1
输入2=$2
awk'
NR==FNR{
a[$1]=$2;
下一个
} {
如果(19美元<20美元)
打印$0,substr(a[“030-031”],$19,$5);
否则打印$0,子字符串(a[“030-031”],$20,$5)}'$input2$input1
……剧本很管用。我不能通过使用ARGV[1]来代替显式声明变量来解决这个问题,我认为这是因为awk不会扩展$input1


我做错了什么

这与awk无关。报告错误的是您的SHELL:

script.sh: fork: retry: Resource temporarily unavailable
可能是您的shell不支持执行命令的
$(..)
,或者在
echo
参数中使用不带引号的变量导致了问题,或者
echo
已损坏或其他原因

但是,它与awk或
-v
无关,而与使用shell不喜欢的shell命令填充awk变量无关

请尝试以下任一方法:

awk -v FILEIN=$(echo "$input1") '...'
awk -v FILEIN=`echo "$input1"` '...'
awk -v FILEIN="$input1" '...'
看看哪个有效。我只能说最后一个应该是你所需要的

哦,千万不要像别人建议的那样用双引号来分隔awk脚本。这只会导致各种各样的引用和转义问题,以及在给定一些shell变量值的情况下可能出现噩梦般的失败和/或错误消息


最后-始终引用您的shell变量,除非您试图通过将它们保留为不带引号的方式获得非常具体的结果,并且完全理解所有的注意事项以及这样做对分词、全局化等的影响。

您是否尝试过在awk脚本中使用双引号而不是单引号?您需要转义所有
$
,但这样您就可以直接使用
$input
。@Trenin我认为这不是一个好办法。使用单引号并在
-v
或代码后面声明变量。@Trenin。感谢您的解决方案。我没有想到这一点,它是有效的。但是,我同意@Jotne的观点,即它并不理想,使用
-v
传递一次变量会更好(特别是
$input1
的路径并不总是恒定的)@Jotne,你能详细说明我如何避免错误消息,如你所说,在“代码之后”声明变量。awk-v FILEIN=“$1”…有什么问题吗?虽然出乎意料,但命令替换似乎使您的shell一次可以拥有的进程数量受到限制。@chepner我认为您可能是对的-尽管我无法确认,因为目前一切正常。出于兴趣-为什么您的方法
awk-v FILEIN=“$1”…
使用更少的进程?好的,谢谢。我试试这个。然而,正如我之前提到的,这个问题是零星的,目前我没有得到任何错误。我认为@chepner可能是正确的——我可能在文件描述符或进程的数量上达到了极限。一旦我确认其中一个解决方案有效,我就会发布。
script.sh: fork: retry: Resource temporarily unavailable
awk -v FILEIN=$(echo "$input1") '...'
awk -v FILEIN=`echo "$input1"` '...'
awk -v FILEIN="$input1" '...'