在 ksh 中使用 -i 选项(从文件读取 sql)在 运行sqlcmd 之后文件描述符 and/orI/O 流的意外行为创建无限循环

Unexpected behavior of file descriptor and/or I/O streams after running sqlcmd with -i option (read sql from file) in ksh creates infinite loop

有没有办法在我的 ksh 脚本中使用 sqlcmd-i input_file 选项而不创建无限循环?

无限循环代码:

exec 3<&0
exec 0<"${file}"
while read -r line || [[ -n ${line} ]]
do
    echo "${line}"
    sqlcmd -S svr -U usr -P pwd -i input_file >/dev/null 2>&1
done
exec 0<&3
exec 3<&-
echo "Script completed successfully!"

输出:

line 1 ...
line 1 ...
...
line 1 ...^C

解决方法(使用此处文档而不是-i input_file选项):

exec 3<&0
exec 0<"${file}"
while read -r line || [[ -n ${line} ]]
do
    echo "${line}"
    sqlcmd -S svr -U usr -P pwd <<-EOF
        -- SOME SQL CODE HERE
    EOF
    # here document lines are indented with tabs, not whitespaces.
done
exec 0<&3
exec 3<&-
echo "Script completed successfully!"

输出:

line 1 ...
line 2 ...
line 3 ...
Script completed successfully!

即使这个问题有解决方法,我也想知道这种行为的原因是什么,以及如何在不禁止 -i input_file 选项的情况下使用 sqlcmd 工具。

备注:

问题是 sqlcmd 试图从 stdin 读取,因此将 </dev/null 附加到 sqlcmd 命令解决了问题。重要的是要注意我正在从 file (exec 0<"${file}").

重定向 stdin

修复:

exec 3<&0
exec 0<"${file}"
while read -r line || [[ -n ${line} ]]
do
    echo "${line}"
    sqlcmd -S svr -U usr -P pwd -i input_file </dev/null
done
exec 0<&3
exec 3<&-
echo "Script completed successfully!"

输出:

line 1 ...
line 2 ...
line 3 ...
Script completed successfully!