varに格納されているFishシェルコマンドの代替出力の形式を維持する方法は?

varに格納されているFishシェルコマンドの代替出力の形式を維持する方法は?

私はこの理由でしばらく頭を傷つけました。

> 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 collectifを使用しない限り)。だからあなたはできます

> set tst (cat file)
> printf '%s\n' $tst
line1
line2

関連情報