在 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
选项而不创建无限循环?
- 代码从
$file
中读取行并逐行解析以提取数据并处理其他内容。
- 它使用文件描述符重定向到 "read the
$file
from the 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 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
工具。
备注:
- SQL 服务器的 Microsoft ODBC 驱动程序 11。
- 红帽企业版 Linux 6.7 (KornShell)。
问题是 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!
有没有办法在我的 ksh 脚本中使用 sqlcmd
和 -i input_file
选项而不创建无限循环?
- 代码从
$file
中读取行并逐行解析以提取数据并处理其他内容。 - 它使用文件描述符重定向到 "read the
$file
from thestdin
"。
无限循环代码:
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
工具。
备注:
- SQL 服务器的 Microsoft ODBC 驱动程序 11。
- 红帽企业版 Linux 6.7 (KornShell)。
问题是 sqlcmd
试图从 stdin 读取,因此将 </dev/null
附加到 sqlcmd
命令解决了问题。重要的是要注意我正在从 file (exec 0<"${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
done
exec 0<&3
exec 3<&-
echo "Script completed successfully!"
输出:
line 1 ...
line 2 ...
line 3 ...
Script completed successfully!