프로세스 대체를 사용할 때 stdin을 사용하는 것과 stdin을 사용하는 것의 _<
차이점 은 무엇입니까 ? <
이는 bash를 사용하여 수행됩니다.
예:
read bytes _< <(du -bcm random_iso.iso | tail -1); echo $bytes
답변1
이는 연산자가 아니며 읽기 및 리디렉션 연산자에 전달하는 인수 _<
입니다 . 그 자체가 프로세스 대체입니다(파이프를 가리키는 파일 이름으로 확장됨)._
<
<(cmd)
그것이 하는 일은 다음과 같습니다:
read bytes _ < /proc/self/fd/x
여기서 fd x는 파이프의 읽기 끝입니다.
파이프의 다른(쓰기) 끝에서는 du -bcm random_iso.iso | tail -1
해당 파이프로 리디렉션된 stdout을 사용하여 백그라운드 하위 쉘 프로세스가 실행됩니다.
따라서 출력의 마지막 줄의 첫 번째 단어를 변수 에 저장 하고 나머지 줄을 변수에 read
저장합니다 .$bytes
du -bcm
$_
du -bcm
이제 나는 그것이 어디에서 의미가 있는지 모르겠습니다 . -b
, 옵션 중 어느 것도 -c
표준 -m
이 아닙니다. -c
이는 매우 일반적이며 누적 크기를 제공하는 반면 du
, GNU에서는 -b
파일 크기(디스크 사용량 아님)를 바이트 단위로 가져오는 반면, -m
크기를 다음 메비바이트로 반올림하여 옵션이 충돌할 수 있습니다(아마도 -b
활성화의 부작용으로 사용되었습니다 --apparent-size
.) FreeBSD du에는 -m
(메비바이트용) no -b
, Solaris에는 둘 다 없습니다...
다음과 같이 복잡한 방식으로 작성하려는 의도인 것 같습니다.
wc -c < random_iso.iso
또는:
du --apparent-size -cm random_iso.iso | awk 'END{print $1}'
실제로 GNU 시스템에서 파일 크기를 다음 메비바이트로 반올림하기를 원하는 경우.
답변2
언급했듯이 _<
리디렉션이 아닙니다. 이것은 _
에 최종 인수로 전달됩니다 read
. 그런 <
다음 프로세스 대체의 출력을 stdin으로 리디렉션하는 별도의 리디렉션 연산자로 해석됩니다.
_
Bash 스크립트에서는 내장 기능 과 함께 "일회용 변수"로 사용하는 것이 관례가 되었습니다 read
. Bash에서 _
각 명령이 실행된 후 명령의 마지막 인수로 설정되는 특수 변수입니다. 이 경우 나머지 필드를 모두 에 할당하는 대신 에 bytes
첫 번째 필드가 할당되고 나머지 필드는 변수에 삭제된다는 의미입니다 ._
bytes
_
이는 관례이기는 하지만 이러한 방식으로 남용하는 것을 피해야 할 여러 가지 이유가 있습니다 .
- 이 동작은
_
POSIX에서 지정되지 않습니다. 대부분의 쉘은 특별한 작업을 수행하지 않습니다. - 에는 속성 이 있으며 이를 사용하면 쉘
zsh
에서 오류가 발생합니다._
readonly
- 에서는 대화형
mksh
모드_
에서만 bash의 동작을 갖습니다. 비대화형 스크립트에서는_
다른 목적으로 사용되며 각 명령 뒤에는 아무것도 할당되지 않습니다. - in 은
ksh93
한_
줄의 마지막 명령의 마지막 인수로만 설정됩니다. 를 사용하려면 명령이 별도의 코드 줄에 물리적으로 위치해야 합니다_
. 또한_
ksh93에서는 다양한 컨텍스트에서 다른 많은 용도로 사용되도록 오버로드되므로_
이 목적으로 할당하는 것은 권장되지 않으며 컨텍스트에 따라 다른 작업을 수행합니다.
상황을 더 명확하게 하기 위해 리디렉션 앞에 공백을 두는 것이 좋습니다. 나는 좋은 리디렉션 스타일에 대한 몇 가지 지침을이 기사.