フィッシュシェル:変数にパイプを接続または読み取りして、複数行の出力をキャプチャします。

フィッシュシェル:変数にパイプを接続または読み取りして、複数行の出力をキャプチャします。

もしあなたなら

curl https://www.toptal.com/developers/gitignore/api/python

改行文字を含む期待どおりにファイルが表示されます。しかし、もし私が

set response (curl https://www.toptal.com/developers/gitignore/api/python)
echo $response

魚の改行文字が消えた。魚見たことないreadけど

url $gitignoreurlbase/python | read response # I have also tried read -d 'blah'
echo $response

ただスペースでマークしてください。

複数行の出力をキャプチャする方法は?

答え1

set var (command)使用。 。 。交換set var (command | string split0)

説明する:

デフォルトでは、コマンド置換は改行に分割されます。 $response変数は行リスト出力。これはファイルに書き込む

$ set var (seq 10)
$ set --show var
$var: not set in local scope
$var: set in global scope, unexported, with 10 elements
$var[1]: length=1 value=|1|
$var[2]: length=1 value=|2|
$var[3]: length=1 value=|3|
$var[4]: length=1 value=|4|
$var[5]: length=1 value=|5|
$var[6]: length=1 value=|6|
$var[7]: length=1 value=|7|
$var[8]: length=1 value=|8|
$var[9]: length=1 value=|9|
$var[10]: length=2 value=|10|
$var: not set in universal scope

幸いにも治療法も同じだ。

$ set var (seq 10 | string split0)
$ set -S var
$var: not set in local scope
$var: set in global scope, unexported, with 1 elements
$var[1]: length=21 value=|1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n|
$var: not set in universal scope

# OR
$ set oldIFS $IFS
$ set --erase IFS
$ set var (seq 10)
$ set -S var
$var: not set in local scope
$var: set in global scope, unexported, with 1 elements
$var[1]: length=20 value=|1\n2\n3\n4\n5\n6\n7\n8\n9\n10|
$var: not set in universal scope
$ set IFS $oldIFS

string split0末尾の改行維持の違いに注意してください。

$responseを行リストとして使用することに同意しますが、それを正しく表示したい場合:

printf "%s\n" $response

# or, with just a literal newline as the join string
string join "
" $respose

関連情報