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까지 명령 출력을 캡처합니다. 최대 하나의 항목이 있어 string split0여러 매개변수가 발생할 수 있습니다.

답변2

Fish는 명령 대체 결과를 다음과 같이 저장합니다.행 목록( string collectif를 사용하지 않는 한). 그래서 당신은 할 수 있습니다

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

관련 정보