다음 명령은 거의 동일한 것 같습니다.
read varname
varname=$(head -1)
varname=$(sed 1q)
read
한 가지 차이점은 while과 are가 내장 쉘이 아니라는 것입니다 .head
sed
그 외에도 세 사람의 행동에 차이가 있나요?
내 동기는 쉘과 주요 유틸리티(예 head,sed
: using을 head
쉽게 대체할 수 있다면 read
왜 read
내장 함수로 존재합니까?)를 더 잘 이해하는 것입니다.
답변1
효율성이나 내장성이 가장 큰 차이점은 아닙니다. 특정 입력의 경우 모두 다른 출력을 반환합니다.
head -n1
후행 줄바꿈은 입력에 줄바꿈이 있는 경우에만 제공됩니다.sed 1q
후행 개행 문자는 항상 제공되지만 그렇지 않으면 입력이 유지됩니다.read
후행 줄 바꿈은 제공되지 않으며 백슬래시 시퀀스가 해석됩니다.
또한 read
분할, 시간 초과 및 입력 기록과 같은 다른 옵션이 있으며 그 중 일부는 표준이고 다른 일부는 셸마다 다릅니다.
답변2
한편으로는 전체 줄을 읽는 대신 read를 사용하여 텍스트를 구문 분석할 수 있습니다.
echo "foo:bar:baz" | {
IFS=: read one two three
echo $two
}
답변3
시스템 호출 속도를 높이기 위해 내장 함수가 존재합니다. 그러므로 나는 read
그 명령이 더 효율적이기 위해 내장된 명령으로 존재한다고 믿습니다.
에서 인용여기,
이러한 내장 명령은 셸의 일부이며 셸 소스 코드의 일부로 구현됩니다. 쉘은 실행하라는 명령이 내장 명령 중 하나임을 인식하고 별도의 실행 파일을 호출하지 않고 자체적으로 작업을 수행합니다. 기본 세트에는 중복되는 부분이 많지만 쉘마다 내장 기능이 다릅니다.
read
이제 여러분이 이것을 직접 실험하여 이것이 쉘 내장으로 존재하는 이유를 이해할 수 있기를 바랍니다 .
strace
일반적으로 쉘 내장에서는 이 작업을 수행 할 수 없습니다 . 그러나 해결 방법이 있습니다. 이것은 이것에 매우 명확하게 설명되어 있습니다.답변.
- 첫 번째 셸에서 명령을 실행합니다
stty -echo
. - 다른 쉘을 열고 다음과 같이 명령을 실행하십시오
cat | strace bash > /dev/null
. - 이제 쉘은 사용자가 명령을 입력할 때까지 기다리고, 사용자가 명령을 입력하면 시스템 수준에서 어떤 일이 발생하는지 확인할 수도 있습니다.
- 위의 3개 명령어를 주면 나머지 2개 명령어에 비해 read의 시스템 호출 수가 적은 것을 확인할 수 있습니다. 출력물이
strace
꽤 크기 때문에 붙여넣지 않겠습니다 .
답변4
varname
쉘 스크립트에서는 읽기 전용을 사용할 수 있지만 나머지 두 개는 쉘 스크립트 없이도 사용할 수 있습니다.
예를 들어:
터미널에서 간단히 및 명령을 사용할 수 있지만 varname=$(head -1)
참조하는 파일의 맨 윗줄에 있는 인수도 제공해야 합니다.varname=$(sed 1q)
varnam=$(head -1 file1)