如何抑制Shell脚本中以下命令的cat输出?
解决Shell脚本中抑制cat输出的问题
你的脚本里用cat <<EOS读取here-doc内容时,多余的-c参数会触发无效命令执行,同时cat会把here-doc内容输出到终端。要彻底解决这个问题,最直接的方式是避免不必要的cat调用,用Shell原生语法完成变量赋值即可消除cat输出。
修正后的基础写法
curl=$(cat <<'EOS' curl -s https://api.openai.com/v1/completions \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer foo" \ -d '{ "model": "text-davinci-003", "prompt": "$1", "max_tokens": 4000, "temperature": $2 }' \ --insecure | jq '.choices[]' EOS ) eval "${curl}" | tee "$newFileName"
关键调整点
- 移除多余的
-c参数,避免触发无效命令 - 用
$(...)替代反引号(更现代的命令替换写法,可读性更强) - 给
EOS加单引号,防止here-doc内的$1、$2提前展开,保留到eval阶段再解析 - 用反斜杠
\连接多行命令,让脚本结构更整洁
彻底抛弃cat的优化写法
Shell支持直接通过here-doc给变量赋值,完全不需要调用cat,从根源上消除cat输出:
read -r -d '' curl <<'EOS' curl -s https://api.openai.com/v1/completions \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer foo" \ -d '{ "model": "text-davinci-003", "prompt": "$1", "max_tokens": 4000, "temperature": $2 }' \ --insecure | jq '.choices[]' EOS eval "${curl}" | tee "$newFileName"
更安全的替代方案(避免eval)
eval存在安全风险,若参数包含特殊字符可能导致意外执行。推荐把curl命令封装成函数,完全规避cat和eval的问题:
call_openai() { curl -s https://api.openai.com/v1/completions \ -H 'Content-Type: application/json' \ -H "Authorization: Bearer foo" \ -d '{ "model": "text-davinci-003", "prompt": "'"$1"'", "max_tokens": 4000, "temperature": '"$2"' }' \ --insecure | jq '.choices[]' } call_openai "$1" "$2" | tee "$newFileName"
内容的提问来源于stack exchange,提问作者Anonymous coder
相关产品推荐
相关产品推荐

