私はこの理由でしばらく頭を傷つけました。
> cat file
line1
line2
> set tst (cat file)
> echo "$tst"
line1 line2
> set tst "(cat file)"
> echo "$tst"
(cat file)
bash
次のように実行できます。
$ cat file
line1
line2
$ tst=$(cat file)
$ echo "$tst"
line1
line2
答え1
デフォルトでは、fishはコマンド置換を分割します((command)
)。この動作を無視するには、特殊機能を使用できます。ひもstring split
(分割対象を定義できます)、string split0
(NULバイト分割)、string collect
([0]を全く分割しない)などのサブコマンドです。
答えは次のとおりです。
set tst (cat file | string collect)
echo $tst
[0]:Unixは引数をNUL終了文字列として渡すため、NULバイトをコマンドに渡すことはできません。したがって、コマンドは引数が続くかどうかを知らないため、string collect
実際には最初のNULまでコマンド出力をキャプチャします。最大1つのエントリがあるため、複数のパラメータstring split0
が発生する可能性があります。
答え2
Fish はコマンド置換の結果を次のように保存します。行リスト(string collect
ifを使用しない限り)。だからあなたはできます
> set tst (cat file)
> printf '%s\n' $tst
line1
line2