ksh에서 -i 옵션 (파일에서 SQL 읽기)을 사용하여 sqlcmd를 실행 한 후 파일 설명자 및 / 또는 I / O 스트림의 예기치 않은 동작이 무한 루프를 생성 함

낙타 Camelius

내 ksh 스크립트에서 무한 루프를 만들지 않고 옵션 sqlcmd과 함께 사용하는 방법이 -i input_file있습니까?

  • 이 코드 $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.
  • Red Hat Enterprise Linux 6.7 (KornShell).
낙타 Camelius

@meuh가 주석에서 언급했듯이 stdinsqlcmd 을 읽고 있었으므로 추가 하면 문제가 해결되었습니다. 문제는 것이 었습니다 루프가 반복 된 표준 입력 (이전 파일에서 리디렉션 )과 내부입니다 그 시도가에서 읽고 표준 입력 . 해결책은 stdin 대신 읽도록 만드는 것입니다 .</dev/nullwhileexec 0<"${file}"sqlcmdwhilesqlcmd/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!"

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관