프로세스 대체를 사용할 때 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
표준 출력이 파이프로 리디렉션되는 백그라운드 하위 셸 프로세스가 실행 중입니다.
따라서 출력의 마지막 줄의 첫 번째 단어는 변수에 저장 read
되고 나머지 줄은 변수에 저장됩니다.$bytes
du -bcm
$_
du -bcm
이제 나는 이것이 무슨 의미인지 모르겠습니다 . -b
, -c
옵션은 -m
표준이 아닙니다. while -c
은 일반적이며 누적 크기를 제공하는 데 사용됩니다. GNU의 경우 du
파일 -b
크기를 바이트 단위로 가져오고(디스크 사용량이 아님) while -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
다음 <
프로세스 대체 출력을 표준 입력으로 리디렉션하는 별도의 리디렉션 연산자로 해석됩니다.
_
Bash 스크립트에서는 내장 변수를 "일회용 변수"로 사용하는 것이 일반적인 관행이 되었습니다 read
. Bash에서 _
각 명령이 실행된 후 명령의 마지막 인수로 설정되는 특수 변수입니다. 이 경우, 이는 나머지 모든 필드가 할당되는 것이 아니라 bytes
첫 번째 필드가 할당되고 나머지 필드가 변수에 삭제됨을 의미합니다 ._
bytes
이는 일반적인 관행이지만 _
이러한 방식으로 남용을 피해야 할 타당한 이유가 많이 있습니다.
_
POSIX는 이 동작을 지정하지 않습니다. 대부분의 쉘은 특별한 작업을 수행하지 않습니다.- 에는 이 속성이 있으며
zsh
, 이 속성을 사용하면 셸에서 오류가 발생합니다._
readonly
- 에서는 대화형
mksh
모드_
의 bash 동작만 있습니다. 비대화형 스크립트에서는_
다른 목적으로 사용되며 각 명령 뒤에는 아무것도 할당되지 않습니다. - in 은
ksh93
한_
줄의 마지막 명령의 마지막 인수로만 설정됩니다. 명령은 물리적으로 별도의 코드 줄에 있어야 사용됩니다_
. 또한_
ksh93에서는 다양한 컨텍스트에서 다른 용도로 사용할 수 있도록 오버로드되었으므로_
이 목적으로 할당하는 것은 권장되지 않으며 컨텍스트 작업에 따라 다르게 실행됩니다.
상황을 더 명확하게 하기 위해 리디렉션 앞에 공백을 추가하는 것이 좋습니다. 나는 좋은 리디렉션 스타일에 대한 몇 가지 지침을이 기사.