운영 체제에서 어떤 개행 문자를 사용하는지 확인할 수 있는 방법이 있나요?

운영 체제에서 어떤 개행 문자를 사용하는지 확인할 수 있는 방법이 있나요?

이 오픈 소스 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가 있으면 삭제되고, 없으면 입력 줄이 변경되지 않습니다.

스크립트가 입력 시 다른 줄 끝을 자동으로 변환하도록 함으로써 파일에 어떤 유형의 줄 끝이 있는지는 실제로 중요하지 않으며 스크립트의 이식성이 향상됩니다. 또는 적어도 입력에 구애받지 않습니다.

관련 정보