有没有办法使用sqlcmd
with-i input_file
选项而不在我的 ksh 脚本中创建无限循环?
- 该代码逐行读取
$file
并解析它以提取数据并处理其他内容。 - 它使用文件描述符重定向来“读取
$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 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!
即使这个问题有解决方法,我也想知道这种行为的原因是什么,以及如何使用该sqlcmd
工具而不禁止它的-i input_file
选项。
笔记:
- 适用于 SQL Server 的 Microsoft ODBC 驱动程序 11。
- 红帽企业 Linux 6.7 (KornShell)。
答案1
正如@meuh 在评论中提到的,sqlcmd
正在阅读标准输入因此附加</dev/null
解决了这个问题。问题是循环while
迭代了标准输入(之前从文件重定向exec 0<"${file}"
)并且尝试从文件sqlcmd
中while
读取标准输入。解决方案是使sqlcmd
读取/dev/null
而不是标准输入。
使固定
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!"