echo '1 2 3'
아래의 첫 번째 명령은 별도의 줄에 각 숫자를 생성합니다. 둘 사이의 유일한 차이점은 and echo {1..3}
(둘 다 동일한 출력을 생성함)를 사용한다는 점이므로 두 번째 명령도 동일한 작업을 수행하기를 원합니다 .그러나 두 번째 명령은 개행 대신 탭으로 구분된 숫자를 생성합니다. 왜?
또한 두 번째 명령과 세 번째 명령의 유일한 차이점은 프로세스 대체를 통해 결과를 전달한다는 것입니다 paste
. 하지만 그렇지 않으면 예상된 결과가 표시됩니다. 이는 paste
관련 문제일 수도 있지만 무엇을 잘 이해하지 못합니다. 문제는.
§ paste <(echo '1 2 3' | tr ' ' '\t' | tr '\t' '\n')
1
2
3
§ paste <(echo {1..3} | tr ' ' '\t' | tr '\t' '\n')
1 2 3
§ echo {1..3} | tr ' ' '\t' | tr '\t' '\n'
1
2
3
프로세스 교체 파이프의 끝에서 생성된 출력을 살펴보고 무엇이 출력되고 있는지 살펴보았는데 실제로는 동일해 보였습니다.
§ paste <(echo {1..3} | tr ' ' '\t' | tr '\t' '\n' | tee /dev/stderr) > /dev/null
1
2
3
§ paste <(echo '1 2 3' | tr ' ' '\t' | tr '\t' '\n' | tee /dev/stderr) > /dev/null
1
2
3
중요한 경우 도구 버전은 다음과 같습니다.
§ which tr paste
/usr/local/opt/coreutils/libexec/gnubin/tr
/usr/local/opt/coreutils/libexec/gnubin/paste
§ tr --version
tr (GNU coreutils) 9.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
Written by Jim Meyering.
§ paste --version
paste (GNU coreutils) 9.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
Written by David M. Ihnat and David MacKenzie.
§ bash --version
bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin20)
Copyright (C) 2007 Free Software Foundation, Inc.
§ sw_vers
ProductName: macOS
ProductVersion: 11.7.10
BuildVersion: 20G1427
저는 macOS를 사용하고 있지만 brew
.
활성 댓글에서 요청한 디버깅 정보를 추가합니다 set -x
.
§ paste <(echo {1..3} | tr ' ' '\t' | tr '\t' '\n')
+ paste /dev/fd/63 /dev/fd/62 /dev/fd/61
++ echo 1
++ echo 3
++ tr ' ' '\t'
++ tr ' ' '\t'
++ tr '\t' '\n'
++ tr '\t' '\n'
++ echo 2
++ tr ' ' '\t'
++ tr '\t' '\n'
1 2 3
§ paste <(echo {1..3} | tr ' ' '\n')
+ paste /dev/fd/63 /dev/fd/62 /dev/fd/61
++ echo 1
++ tr ' ' '\n'
++ echo 2
++ echo 3
++ tr ' ' '\n'
++ tr ' ' '\n'
1 2 3
§ echo {1..3} | tr ' ' '\n' | paste
+ tr ' ' '\n'
+ echo 1 2 3
+ paste
1
2
3
그리고 hexdump
출력:
§ paste <(echo {1..3} | tr ' ' '\n') | hexdump -C
00000000 31 09 32 09 33 0a |1.2.3.|
00000006
§ echo {1..3} | tr ' ' '\n' | paste | hexdump -C
00000000 31 0a 32 0a 33 0a |1.2.3.|
00000006