bash와 git-bash 결과가 다른 이유는 무엇입니까?

bash와 git-bash 결과가 다른 이유는 무엇입니까?

초보자는 bash와 jq를 배우고 싶어합니다. 저는 Windows 컴퓨터를 사용하고 있으므로 git bash로 테스트하고 싶었습니다. git bash는 Linux에서 실행되는 bash와 동일하다고 생각합니다.

테스트를 위해 JSON에서 목록을 변수로 추출해 보았습니다. 그러나 이상한 결과가 나왔기 때문에 Ubuntu의 Docker 컨테이너에서 동일한 코드를 시도했습니다. 우분투는 나에게 예상된 결과를 주었다.

왼쪽은 Docker에서 실행되는 Ubuntu입니다. 오른쪽에는 git bash가 있습니다. 두 결과가 다른 이유를 설명할 수 있는 사람이 있습니까?

배쉬 예

죄송합니다. 텍스트는 다음과 같습니다.

우분투:

root@ac88bd1c736e:/usr/local/bin# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
root@ac88bd1c736e:/usr/local/bin# jq --version
jq-1.6
root@ac88bd1c736e:/usr/local/bin# ls -la
total 20
drwxr-xr-x 1 root root 4096 Mar  8 16:48 .
drwxr-xr-x 1 root root 4096 Mar  1 02:03 ..
-rwxr-xr-x 1 root root   56 Jul 25  2022 service.py
-rwxr-xr-x 1 root root   96 Mar  7 18:21 test.json
root@ac88bd1c736e:/usr/local/bin# cat test.json
{
        "foo": "bar",
        "access": [
                "rangers",
                "avs"
        ],
        "blah": {
                "bizz": "buzz"
        }
}root@ac88bd1c736e:/usr/local/bin# foo=`cat test.json | jq .access`
root@ac88bd1c736e:/usr/local/bin# echo $foo
[ "rangers", "avs" ]
root@ac88bd1c736e:/usr/local/bin#

자식 배쉬:


leehenry@PW03T2JD MINGW64 ~/..../bash
$ git --version
git version 2.39.2.windows.1

leehenry@PW03T2JD MINGW64 ~/..../bash
$ jq --version
jq-1.6

leehenry@PW03T2JD MINGW64 ~/..../bash
$ cat test.json
{
        "foo": "bar",
        "access": [
                "rangers",
                "avs"
        ],
        "blah": {
                "bizz": "buzz"
        }
}
leehenry@PW03T2JD MINGW64 ~/..../bash
$ foo=`cat test.json | jq .access`

leehenry@PW03T2JD MINGW64 ~/..../bash
$ echo $foo
 ]avs"ers",

leehenry@PW03T2JD MINGW64 ~/..../bash
$

답변1

이것은 CRLF와 LF 라인 종결자에 대한 질문입니다.

나는 희망

$ cat test.json | jq .access

꽤 정상적으로 보입니다. 각 출력 CR은 보이지 않으며 LF는 다음 줄로 이동합니다.

다음을 통해 확인할 수 있습니다.

$ cat test.json | jq .access | hexdump -C

또는 파이프를 통해 더 간결하게 전달하세요 | hd. 0x0d CR 및 0x0a LF를 참고하세요.

나중에 apt install dos2unix jq의 출력을 파이핑하여 문제를 해결할 수 | dos2unix있고 필요한 경우 hexdump를 사용하여 확인할 수 있습니다.


맨페이지 bash가 꽤 깁니다. 구체적인 장소는 다음과 같습니다

$ foo=`cat test.json | jq .access`

당신을 넘어뜨렸습니다.

명령 대체...

Bash는 명령 대체를 명령의 표준 출력으로 바꾸고 후행 줄 바꿈을 제거하여 확장을 수행합니다.

tr따라서 LF를 제거하고 CR을 유지하는 것으로 생각하십시오 .

또한 다음 변수에 유의하세요.

IFS

내부 필드 구분 기호는 확장 후 단어 분할 및 read 내장 명령을 사용하여 행을 단어로 분할하는 데 사용됩니다. 기본값은 입니다 <space><tab><newline>.

각도 개행 문자를 Grep'ing하면 이런 일이 발생하는 더 많은 장소가 드러납니다.

bash따라서 구문 분석할 CR이 포함된 출력이 필요한 경우 설정을 jq조정해야 할 수도 있습니다 .IFS

또는 귀하의 요구 사항에 더 적합한 컴퓨팅 컨텍스트를 선택하십시오.


16진수 덤프 일반적으로 Ubuntu의 표준 구성입니다.

https://packages.ubuntu.com/jammy/amd64/bsdextrautils/filelist

분실한 경우 apt install bsdmainutils이것을 사용하여 끌어올 수 있습니다.

관련 정보