bash参数列表在linux上太长,但在mac上不太长

bash参数列表在linux上太长,但在mac上不太长,linux,bash,Linux,Bash,以下是我运行的shell脚本: for file in “$d/resources/“*; do resourceName=$(basename $file) echo “Inserting resouce: $resourceName...” resource=`cat $file` # Generate id with md5 resourceId=$((resourceId+1)) # Inse

以下是我运行的shell脚本:

for file in “$d/resources/“*; do
        resourceName=$(basename $file)
        echo “Inserting resouce: $resourceName...”
        resource=`cat $file`
        # Generate id with md5
        resourceId=$((resourceId+1))
        # Insert into resources table
        cqlsh -e “INSERT INTO $TENANT_NAME.resources (id, target,lastUpdateDate,lastUpdateUser,algorithmName,resourceName,resourceContent) VALUES ( $resourceId, ‘template’, toTimestamp(now()), null, ‘$algorithmName’, ‘$resourceName’, \$\$$resource\$\$);” $STORAGE_HOST_ADDRESS $STORAGE_HOST_PORT
    done

在mac上,它工作正常,但在linux上,由于$resource,它抛出的错误bash参数列表太长。谁能告诉我怎么解决这个问题吗?谢谢。

Linux的每个参数限制为128k。macOS对arguments+环境的限制为256k

改为将查询写入文件,并让cqlsh执行该查询而不是环境:

cqlsh -f myqueryfile host port

查看您的环境变量集;您可以使用env获取列表。在Linux和MacOS上,导出的所有内容都与最大命令行参数列表长度有关,这就是为什么您应该只分配变量而不使用export关键字,除非您有非常具体的原因将它们存储在环境块中,而不是shell的动态分配堆中。顺便说一句,粘贴在这里的代码有智能引号。Bash不尊重这些;你需要使用。。。和“…”,而不是“…”/“…”…我通常还建议您运行代码,并修复它发现的其他主要引用相关错误。但是导致错误的直接原因是环境的内容,与您提供的脚本无关。如果它在128到256k之间,那么它将在Linux上失败,而不是在macOS上。当然,cqlsh提供了一种从流而不是从其参数读取的机制。使用它。谢谢你的回复。我试过了,但是我插入的资源内容太大了,这使得cqlsh至少花了20分钟来阅读它。有什么办法可以解决这个插入速度慢的问题吗?你是说-e比-f快得多,即使两者都能正常工作,并且-e不会因为你所问的错误而立即失败?当文件大小很小时,-e和-f都能工作。当文件大小较大时,-e不起作用,-f起作用,但速度较慢。对于某些查询,cqlsh速度较慢与运行shell命令时参数列表过长完全是两个问题。。。