$(<file)
(와 함께 작동 `<file`
)은 zsh
and로 복사 한 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
)"
아무것도 확장되지 않습니다.
처럼 zsh
A와 더 가을 다시가 없습니다 불구하고, 하나 개의 파일의 표준 입력 리디렉션, $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 기반 변형은 ksh
ksh93과 비교하여 몇 가지 변형이 있습니다. 관심있는 것은 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는 그것을 제거하지 않기 때문입니다. 아무것도 출력하지 않고 프롬프트로 돌아갑니다.