$(<file)(와 함께 작동 `<file`)은 zshand로 복사 한 Korn 쉘의 특수 연산자입니다 bash. 명령 대체와 비슷하게 보이지만 실제로는 그렇지 않습니다.
POSIX 셸에서 간단한 명령은 다음과 같습니다.
< file var1=value1 > file2 cmd 2> file3 args 3> file4
모든 부분은 선택 사항이며 방향 전환 만, 명령 만, 할당 만 또는 조합 할 수 있습니다.
재 지정이 있지만 명령이없는 경우 재 지정이 수행되므로 ( > file열리고 잘림 file) 아무 일도 일어나지 않습니다. 그래서
< file
엽니 다 file읽을 수 있지만 명령이 없습니다로 다음 아무 반응이 없습니다. 그래서 file닫히고 그게 끝입니다. 만약이 $(< file)간단한이었다 명령 치환 그때는 아무것도 확장 것이다.
에서 POSIX 사양 에 $(script), 경우는 script그 만 리디렉션 구성 지정되지 않은 결과를 생성합니다 . 그것은 Korn 쉘의 특별한 행동을 허용하는 것입니다.
ksh (여기서는으로 테스트 됨 ksh93u+)에서 스크립트 가 리디렉션 (명령 없음, 할당 없음)으로 만 구성된 하나의 간단한 명령 (전과 후에 주석이 허용되지만)과 첫 번째 리디렉션이 stdin (fd) 인 경우 0) 입력 만 ( <, <<또는 <<<) 리디렉션 :
$(< file)
$(0< file)
$(<&3)( $(0>&3)실제로 같은 연산자이기 때문에)
$(< file > foo 2> $(whatever))
하지만:
$(> foo < file)
- ...도 아니다
$(0<> file)
- ...도 아니다
$(< file; sleep 1)
- ...도 아니다
$(< file; < file2)
그때
- 첫 번째 리디렉션을 제외한 모든 것은 무시됩니다 (구문 분석됩니다)
- 그리고 파일 / heredoc / herestring (또는 같은 것을 사용하는 경우 파일 설명자에서 읽을 수있는 내용
<&3)에서 마지막 줄 바꿈 문자를 뺀 내용으로 확장됩니다 .
$(cat < file)그것을 제외하고 사용 하는 것처럼
- 읽기는 쉘이 아닌 내부적으로 수행합니다.
cat
- 파이프 나 추가 프로세스가 필요하지 않습니다
- 위의 결과로, 내부 코드가 서브 쉘에서 실행되지 않기 때문에, 이후의 수정은 (
$(<${file=foo.txt})또는$(<file$((++n))) )
- 읽기 오류 (파일을 열거 나 파일 설명자를 복제하는 동안 오류는 발생하지 않음)는 자동으로 무시됩니다.
에서은 zsh, 그것은 단지 하나의 파일 입력 리디렉션있을 때 특별한의 동작은 트리거 것을 제외하고는 동일합니다 ( <file또는 0< file, 아니 <&3, <<<here, < a < b...)
그러나 다른 쉘을 에뮬레이션 할 때를 제외하고는 다음과 같습니다.
< file
<&3
<<< here...
즉, 명령 대체 외부에서 명령이없는 입력 리디렉션 만 zsh있는 경우 $READNULLCMD(기본적으로 호출기)를 실행하고 입력 및 출력 리디렉션이 모두있는 경우 $NULLCMD( cat기본적으로) 따라서 ( $(<&3)특별히 인식되지 않는 경우에도) 연산자, ksh호출기를 호출하여 호출하는 것처럼 작동 합니다 (호출기 작동cat 표준 이 파이프가되기 때문에 ).
그러나 동안 ksh의는 $(< a < b)의 내용으로 확장 할 a에, zsh그것의 내용으로 확장, a및 b(또는 b경우 생성 multios옵션을 사용하지), $(< a > b)복사 할 a에 b아무것도 등으로 확장
bash 비슷한 연산자가 있지만 몇 가지 차이점이 있습니다.
코멘트는 전에 허용되지만 후에는 허용되지 않습니다.
echo "$(
# getting the content of file
< file)"
작동하지만 :
echo "$(< file
# getting the content of file
)"
아무것도 확장되지 않습니다.
처럼 zshA와 더 가을 다시가 없습니다 불구하고, 하나 개의 파일의 표준 입력 리디렉션, $READNULLCMD그래서 $(<&3), $(< a < b)리디렉션을 수행하지만, 아무것도 확장 않습니다.
- 어떤 이유로
bash호출하지는 않지만 cat파이프를 통해 파일의 내용을 공급하는 프로세스를 여전히 포크하여 다른 쉘보다 최적화 수준이 훨씬 낮습니다. 내장 된 $(cat < file)위치 와 같은 효과 cat가 있습니다 cat.
- 위의 결과로, 변경 내용은 이후에 손실됩니다 (
$(<${file=foo.txt})예 : 위에서 언급 한 $file할당은 나중에 손실 됨).
에서은 bash, IFS= read -rd '' var < file (도에서 작동 zsh)를의 내용을 읽을 수있는보다 효과적인 방법입니다 텍스트 변수로 파일을. 또한 후행 줄 바꿈 문자를 유지하는 이점이 있습니다. 참고 $mapfile[file]로 zsh합니다 (의 zsh/mapfile바이너리 파일과 함께 작동하는 모듈과 정규 파일의 경우).
pdksh 기반 변형은 kshksh93과 비교하여 몇 가지 변형이 있습니다. 관심있는 것은 mksh(pdksh 파생 쉘 중 하나)에서
var=$(<<'EOF'
That's multi-line
test with *all* sorts of "special"
characters
EOF
)
여기서는 문서의 경우와 같이 임시 파일이나 파이프를 사용하지 않고 여기 문서의 내용 (후행 문자없이)을 확장하여 효과적인 여러 줄 인용 구문으로 만듭니다.
모든 버전의 호환성을 ksh, zsh그리고 bash가장으로 만 제한하는 $(<file)변수 수정 월 내에 또는 유지되지 않을 수도 있다는 사실 이루어진 주석 및 베어링을 회피.
bash해석 할 것입니다."라고 말하면cat filename이 동작이 명령 대체에만 해당되는 것입니까? 내가< filename스스로 실행하면 bash는 그것을 제거하지 않기 때문입니다. 아무것도 출력하지 않고 프롬프트로 돌아갑니다.