read, head -1 및 sed 1q 사이에 차이가 있습니까?

read, head -1 및 sed 1q 사이에 차이가 있습니까?

다음 명령은 거의 동일한 것 같습니다.

read varname
varname=$(head -1)
varname=$(sed 1q)

read한 가지 차이점은 while과 are가 내장 쉘이 아니라는 것입니다 .headsed

그 외에도 세 사람의 행동에 차이가 있나요?

내 동기는 쉘과 주요 유틸리티(예 head,sed: using을 head쉽게 대체할 수 있다면 readread내장 함수로 존재합니까?)를 더 잘 이해하는 것입니다.

답변1

효율성이나 내장성이 가장 큰 차이점은 아닙니다. 특정 입력의 경우 모두 다른 출력을 반환합니다.

  • head -n1후행 줄바꿈은 입력에 줄바꿈이 있는 경우에만 제공됩니다.

  • sed 1q후행 개행 문자는 항상 제공되지만 그렇지 않으면 입력이 유지됩니다.

  • read후행 줄 바꿈은 제공되지 않으며 백슬래시 시퀀스가 ​​해석됩니다.

또한 read분할, 시간 초과 및 입력 기록과 같은 다른 옵션이 있으며 그 중 일부는 표준이고 다른 일부는 셸마다 다릅니다.

답변2

한편으로는 전체 줄을 읽는 대신 read를 사용하여 텍스트를 구문 분석할 수 있습니다.

echo "foo:bar:baz" | {
  IFS=: read one two three
  echo $two
}

답변3

시스템 호출 속도를 높이기 위해 내장 함수가 존재합니다. 그러므로 나는 read그 명령이 더 효율적이기 위해 내장된 명령으로 존재한다고 믿습니다.

에서 인용여기,

이러한 내장 명령은 셸의 일부이며 셸 소스 코드의 일부로 구현됩니다. 쉘은 실행하라는 명령이 내장 명령 중 하나임을 인식하고 별도의 실행 파일을 호출하지 않고 자체적으로 작업을 수행합니다. 기본 세트에는 중복되는 부분이 많지만 쉘마다 내장 기능이 다릅니다.

read이제 여러분이 이것을 직접 실험하여 이것이 쉘 내장으로 존재하는 이유를 이해할 수 있기를 바랍니다 .

strace일반적으로 쉘 내장에서는 이 작업을 수행 할 수 없습니다 . 그러나 해결 방법이 있습니다. 이것은 이것에 매우 명확하게 설명되어 있습니다.답변.

  1. 첫 번째 셸에서 명령을 실행합니다 stty -echo.
  2. 다른 쉘을 열고 다음과 같이 명령을 실행하십시오 cat | strace bash > /dev/null.
  3. 이제 쉘은 사용자가 명령을 입력할 때까지 기다리고, 사용자가 명령을 입력하면 시스템 수준에서 어떤 일이 발생하는지 확인할 수도 있습니다.
  4. 위의 3개 명령어를 주면 나머지 2개 명령어에 비해 read의 시스템 호출 수가 적은 것을 확인할 수 있습니다. 출력물이 strace꽤 크기 때문에 붙여넣지 않겠습니다 .

답변4

varname쉘 스크립트에서는 읽기 전용을 사용할 수 있지만 나머지 두 개는 쉘 스크립트 없이도 사용할 수 있습니다.

예를 들어:

터미널에서 간단히 및 명령을 사용할 수 있지만 varname=$(head -1)참조하는 파일의 맨 윗줄에 있는 인수도 제공해야 합니다.varname=$(sed 1q)varnam=$(head -1 file1)

관련 정보