나는 단지 파일로부터의 전통적인 입력 리디렉션과 비슷한 효과가 있는 사용법에 대해서만 묻고 있습니다.
<<<"$(<file)"
내가 아는 한 그것은 다음과 같습니다.
<file
제 생각에는 이것들은 기능적으로 동일합니다. 낮은 수준에서 <<< 이 문서는 실제로 동시에 메모리에 더 많은 데이터 복사본을 생성할 수 있습니다.
이러한 유형의 리디렉션이 bash와 zsh 모두에 존재한다는 것을 알고 있지만 zsh 매뉴얼 페이지에 일부 구현 세부 정보가 포함되어 있지만 구현 방법에 대해서는 익숙하지 않습니다.
답변1
(Byron Rakitzis의 Unix 클론에 있는 동일한 연산자에서 영감을 얻은 (여기서, 이 연산자는) and)에 의해 처음 도입되었습니다 <<<"$(<file)"
.zsh
<<<
rc
ksh93
$(<file)
ksh
mksh
bash
$(<file)
쉘이 내용을 읽을 때 file
(차단된 NUL 바이트 제외 zsh
) 모든 후행 줄 바꿈이 제거되어 확장됩니다 $(<file)
(따라서 파일 전체 내용이 메모리에 저장됩니다).
의 경우 <<< some-text
셸은 some-text
개행 문자와 그 뒤에 오는 개행 문자를 임시 파일에 저장하고 파일 설명자 0에서 임시 파일을 엽니다(최근 버전을 포함한 일부 셸에서는 bash
최소한 소량의 데이터에 대해 대신 파이프를 사용할 수 있음).
따라서 기본적으로 후행 개행 문자를 <<<"$(<file)"
읽기 위해 stdin을 여는 것은 file
임시 복사본으로만 대체됩니다(파일에 NUL 바이트가 포함된 경우 모든 종류의 잘못된 동작이 발생합니다 zsh
).
에서는 표준 입력에서 읽기 위해 직접 열립니다 < file
.file
물론 더 효율적이지만(디스크 및 메모리 내 복사본이 포함되지 않음) stdin에서 열린 파일이 다음과 같은지 확인 < file
하고 싶을 수도 있습니다.<<<"$(<file)"
정기적인명령이 시작될 때 파일이 완전히 읽혔는지 확인하거나(예: 명령이 파일에 쓰는 경우) 다른 리디렉션(예: 잘릴 리디렉션 file
) 을 처리합니다 tr 1 2 <<< "$(<file)" > file
.
연산자가 yash
지원된다는 점에 유의하십시오 (비록 파이프를 사용하여 구현되었음에도 불구하고(따라서 지원되지 않음).<<<
정기적인파일) 대신 임시 파일)을 사용합니다. 하지만 $(<file)
그렇지 않습니다. <<<"$(cat < file)"
거기에서 사용하시면 됩니다 . yash
문자열은 단지 문자일 뿐이므로 "$(cat < file)"
유효한 문자를 형성하지 않는 바이트 시퀀스를 차단하지만 다른 쉘에서는 일반적으로 이를 정상적으로 처리할 수 있습니다.
답변2
다음 명령은 모두 파일의 (txt) 내용을 작성합니다(바이너리 파일에서는 시도하지 않음).
cat file
cat <file
echo "$(<file)"
cat <<<"$(<file)"
그러나 이는 cat이 적응 가능한 명령이기 때문이지 명령이 동일하기 때문이 아닙니다.
이 명령은
cat file
파일의 내용을 인쇄합니다. 이 경우 cat은 실제 파일에서 작동합니다. 비슷하다less file
. 그러나 적을수록 실제 파일이 필요합니다.이 명령은
cat <file
스트림으로 추출된 파일의 내용을 표준 입력에서 스트림을 수신하는 cat에 공급합니다. 그러나 cat은 이에 대해 아무런 문제가 없습니다. 또한 스트림을 인쇄하고 동일한 결과를 볼 수 있습니다.이 경우에는
echo "$(<file)"
정확히"$(< file)"
동일합니다(일부 하위 쉘 세부 사항 제외)"$(cat file)"
. 이는 cat 명령이 실행되었음을 의미합니다. 그런 다음 출력은 명령 실행을 통해 텍스트 문자열로 변환되고$(...)
마지막으로 텍스트 문자열은 에코를 통해 인쇄됩니다. 파일 내용을 다시 봅니다.명령은
cat <<<"$(<file)"
다음 순서를 따릅니다."$(<file)"
파일을 읽고 문자열로 출력합니다.<<<
표준 입력(stdin)으로 문자열 보내기cat은 입력(stdin)에서 받은 내용을 인쇄합니다.
동일한 파일 내용이 표시됩니다.
결론적으로
모든 경우에 동일한 결과가 나타납니다. 그러나 파일의 내용은 명령의 모든 부분에서 "그 내용"(파일 이름, 스트림, 문자열 등)을 변경합니다.