bashとgit-bashの結果が異なるのはなぜですか?

bashとgit-bashの結果が異なるのはなぜですか?

初心者はbashとjqを学びたいです。私はWindowsコンピュータを使用しているので、git bashでテストしたいと思いました。 git bashはLinuxで実行されているbashと同じだと思います。

テストのために、JSONからリストを変数として抽出してみました。しかし、奇妙な結果が出たので、UbuntuのDockerコンテナで同じコードを試しました。 Ubuntuは私に予想される結果を与えた。

左側はDockerで実行されるUbuntuです。右側にはgit bashがあります。 2つの結果が異なる理由を説明できる人はいますか?

バッシュの例

申し訳ありません。テキストは次のとおりです。

Ubuntu:

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

内部フィールド区切り文字は、拡張後の単語分割と読み込み組み込みコマンドを使用して行を単語に分割するために使用されます。デフォルト値はです<space><tab><newline>

角度改行文字を Grep'ing すると、これが起こるより多くの場所が明らかになります。

bashしたがって、解析するCRを含む出力が必要な場合は、設定をjq調整する必要があります。IFS

または、お客様のニーズに合ったコンピューティング コンテキストを選択してください。


16進ダンプ 通常はUbuntuの標準構成です。

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

紛失した場合は、apt install bsdmainutilsこれを使用してドラッグできます。

おすすめ記事