null 문자를 구분 기호로 사용하여 매개 변수로 전달된 문자열 연결

null 문자를 구분 기호로 사용하여 매개 변수로 전달된 문자열 연결

$a"\0"$b"\0"$c"\0"$d나는 $a, $b, $c, $d 등의 인수를 수용하고 이를 표준 출력 에 기록하는 CLI 도구를 찾고 있습니다 . CLI에서 파이프라인 시작 부분에 사용할 수 있는 표준 도구가 있습니까? 내 구현에서는 echo사용자 정의 구분 기호를 허용하지 않는 것 같습니다.

답변1

printf이 문제는 거의 다음과 같이 해결될 수 있습니다.

printf "%s\0" "$a" "$b" "$c" ...

printf필요에 따라 해당 형식 문자열을 반복합니다(이 경우 각 매개변수에 대해 한 번씩). 그러면 각 매개변수 뒤에 널 바이트가 따라오게 됩니다.

마지막 널 바이트를 제거하려면 GNU를 사용하십시오 head.

printf "%s\0" "$a" "$b" "$c" ... | head -c-1

Zsh의 내장 기능 print도 후처리 없이 이 작업을 수행할 수 있습니다.

print -rNn "$a" "$b" "$c" ...

( -r이스케이프 처리를 비활성화하고 -N인수를 null 바이트로 구분하여 종료하며 -n터미널 줄 바꿈을 비활성화합니다. 감사합니다.강철 드라이버팁을 주세요! )

답변2

printf명령은 필요에 따라 형식을 반복하므로 다음을 수행할 수 있습니다.

print "%s\0"

우리는 실제로 그것을 볼 수 있습니다:

$ printf "%s\0" hello there | hdump -8                   
00000000  68 65 6C 6C 6F 00 74 68   hello.th
00000008  65 72 65 00               ere.

$ printf "%s\0" hello there everyone out there | hdump -8
00000000  68 65 6C 6C 6F 00 74 68   hello.th
00000008  65 72 65 00 65 76 65 72   ere.ever
00000010  79 6F 6E 65 00 6F 75 74   yone.out
00000018  00 74 68 65 72 65 00      .there.

또한 문자열 끝에 터미널 NUL을 배치한다는 점에 유의하십시오. 이를 원하지 않으면 제거할 수 있습니다.sed 's/.$//'

$ printf "%s\0" hello there everyone out there | sed 's/.$//' | hdump -8
00000000  68 65 6C 6C 6F 00 74 68   hello.th
00000008  65 72 65 00 65 76 65 72   ere.ever
00000010  79 6F 6E 65 00 6F 75 74   yone.out
00000018  00 74 68 65 72 65         .there

관련 정보