bash를 사용하는 stdin의 경우 < 대신 _< 사용

bash를 사용하는 stdin의 경우 < 대신 _< 사용

프로세스 대체를 사용할 때 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저장합니다 .$bytesdu -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에서는 다양한 컨텍스트에서 다른 많은 용도로 사용되도록 오버로드되므로 _이 목적으로 할당하는 것은 권장되지 않으며 컨텍스트에 따라 다른 작업을 수행합니다.

상황을 더 명확하게 하기 위해 리디렉션 앞에 공백을 두는 것이 좋습니다. 나는 좋은 리디렉션 스타일에 대한 몇 가지 지침을이 기사.

관련 정보