Bash의 표준 입력을 사용하려면 < 대신 _<를 사용하세요.

Bash의 표준 입력을 사용하려면 < 대신 _<를 사용하세요.

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

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

관련 정보