이 오픈 소스 bash 스크립트를 실행하려고 하는데 입력을 구문 분석할 때 Linux를 실행한다고 가정하기 때문에 작동하지 않습니다. 실제로 저는 Windows 시스템에서 cygwin을 실행하고 있습니다. 스크립트에 $IFS를 로 설정한 곳이 있는데 \n
, 이는 을 남기는데, \r
이는 정확한 문자열과 일치하지 않아 오류가 발생합니다.
로컬 버전의 스크립트를 수정하는 것은 쉽지만 모든 운영 체제에서 실행되도록 하려면 어떻게 수정해야 합니까? 몇 가지 명령을 실행하여 개행 문자를 얻을 수 있다면 이를 $IFS에 할당할 수 있습니다.
추가 컨텍스트를 위해 개행을 처리하는 코드는 다음과 같습니다.
IFS=\n
# Word splitting is intended here
# shellcheck disable=2046
set -- $(printf '%s\n' "$_response" | jq -r '
.error,
.access_token,
.token_type,
.expires_in,
.refresh_token,
.scope')
IFS=$oifs
[ "$1" = "null" ] && ...
테스트는 "null\r"을 "null"과 비교하는 것으로 끝납니다.
답변1
대본에는
$IFS
[\n
...]
보여주신 코드는 IFS=\n
. 불행하게도 이것은 그렇지 않으며 IFS='\n'
결국에는 설정될 것입니다 IFS=n
. 그러니 어쨌든 코드를 수정해야 합니다.
답변2
작동할 수 있는 또 다른 옵션은 시스템에서 사용하는 줄 종결자를 결정하는 대신 입력 파일에서 사용하는 줄 종결자에 초점을 맞추는 것입니다.
파일을 작성하는 동안이나 후처리(또는 이와 유사한 방법)를 통해 파일의 줄 끝을 변경하는 것이 (프로그래밍 방식으로) 매우 쉽기 때문에 이렇게 말하는 것입니다 dos2unix
.
이 file
명령을 사용하여 파일이 사용하는 줄 끝 부분에 대한 일부 정보를 제공할 수 있습니다.
tim@chaos:~/tmp$ file lnx.txt
lnx.txt: ASCII text
tim@chaos:~/tmp$ file win.txt
win.txt: ASCII text, with CRLF line terminators
tim@chaos:~/tmp$ dos2unix -n win.txt win2unix.txt
dos2unix: converting file win.txt to file win2unix.txt in Unix format...
tim@chaos:~/tmp$ file win2unix.txt
win2unix.txt: ASCII text
따라서 입력 파일을 가져오는 스크립트를 설정하여 다양한 줄 끝을 확인하고 즉시 수정하거나 간단히 입력 파일을 가져오고 dos2unix
.
차이점은 단지 \r\n
비교 일 뿐입니다 \n
. 따라서 쉘 스크립트에서 입력 스트림을 처리하면 파일 변환 없이 CRLF 유형의 줄 끝을 캡처할 수 있습니다.
그러나 쉘 스크립트는 파일을 한 줄씩 읽어서 처리하도록 선택하므로 추가 sed
단계를 추가할 수 있습니다.
다음을 수행할 수 있습니다.
IFS=\n
# Word splitting is intended here
# shellcheck disable=2046
set -- $(printf '%s\n' "$_response" | sed -e s'/\r//g' | jq -r '
.error,
.access_token,
.token_type,
.expires_in,
.refresh_token,
.scope')
IFS=$oifs
[ "$1" = "null" ] && ...
CRLF가 있으면 삭제되고, 없으면 입력 줄이 변경되지 않습니다.
스크립트가 입력 시 다른 줄 끝을 자동으로 변환하도록 함으로써 파일에 어떤 유형의 줄 끝이 있는지는 실제로 중요하지 않으며 스크립트의 이식성이 향상됩니다. 또는 적어도 입력에 구애받지 않습니다.