문맥
$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.$ which read
/usr/bin/read
$ which read
/usr/bin/read
아래 예제 1은 작동하지만 예제 2는 작동하지 않는 이유를 누군가 설명할 수 있습니까?
사례 1 - 작품을 적나라하게 읽는 경우
이것:
declare data
data="pig,cow,horse,rattlesnake,"
declare -a my_array
IFS=',' read -r -a my_array <<< "$data"
for item in "${my_array[@]}"; do echo "$item"; done
생산:
pig
cow
horse
rattlesnake
예 2 - /usr/bin/read 실패
그러면 출력이 생성되지 않습니다.
declare data
data="pig,cow,horse,rattlesnake,"
declare -a my_array
IFS=',' /usr/bin/read -r -a my_array <<< "$data"
for item in "${my_array[@]}"; do echo "$item"; done
답변1
read
은 쉘 내장 명령, 즉 외부 프로그램이 아닌 쉘 자체에서 제공하는 명령입니다. 셸 내장 함수에 대한 자세한 내용은 다음을 참조하세요.내장 명령과 비 내장 명령의 차이점은 무엇입니까?
read
쉘의 상태를 수정하기 때문에 내장 함수가 필요합니다. 특히 출력을 포함하는 변수를 설정합니다. 외부 명령은 호출되는 쉘의 변수를 설정할 수 없습니다. 당신은 또한 볼 수 있습니다CD는 왜 프로그램이 아닌가?.
일부 시스템에는 이라는 외부 명령도 있습니다 read
.논란의 여지가 있는 규정 준수 이유. 외부 명령은 명령이 수행하는 모든 작업을 수행할 수 없습니다. 입력 행을 읽을 수는 있지만 읽은 내용으로 쉘 변수를 설정할 수는 없으므로 외부 명령은 입력 행을 처리하지 않고 삭제하는 데만 사용할 수 있습니다.
which read
내장 함수가 존재한다는 사실을 알려주지 않습니다. 왜냐하면 그것이 해당 기능이 아니기 때문입니다. which
그 자체는 bash 및 기타 Bourne 스타일 셸(zsh 제외)의 외부 명령이므로 외부 명령에 대한 정보만 보고합니다.전화할 만한 합당한 이유가 거의 없습니다.which
. 명령 이름이 무엇을 의미하는지 알아내는 명령은 다음과 같습니다.type
.
bash-5.0$ type read
read is a shell builtin
답변2
read
쉘에도 내장되어 있는데 which
이에 대해 모르겠습니다. 다음을 실행해 보세요.
$ type read
read is a shell builtin
작동하지 않는 이유는 /usr/bin/read
내 시스템에 설치되어 있지 않기 때문에 어떤 응용 프로그램인지 잘 모르겠지만 내장 셸이 원하는 응용 프로그램일 가능성이 있습니다.
답변3
read
현재 환경에 영향을 미치는 쉘 내장 명령입니다. /usr/bin/read
서브쉘에서 실행되는 외부 명령이므로 실행할 수 없습니다.
/usr/bin/read
사실상 쓸모가 없는데 왜 우리는 그것을 갖고 있는 걸까요? 대답은 POSIX입니다. 외부 명령으로도 존재하려면 내장 명령이 필요합니다!
예를 들어 명령도 있습니다 /usr/bin/cd
. 살펴보겠습니다... 하위 쉘을 생성하고 스크립트를 실행한 builtin cd "$@"
다음(기본적으로) 종료합니다... 따라서 유용한 작업은 수행되지 않습니다.
이 이상한 현상의 기본 원리는 다음과 같이 설명됩니다.https://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xcu_chap01.html#tag_23_01_07
답변4
다른 사람들이 언급했듯이 "읽기"는 쉘 내장입니다. 내 시스템에는 /usr/bin/read가 없습니다. 하지만 man read
나에게 다음 사항을 알려주세요.
NAME 읽기 - 파일 설명자에서 읽습니다.
요약 #include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
설명 read()는 파일 설명자 fd의 count 바이트를 buf에서 시작하는 버퍼로 읽으려고 시도합니다.
따라서 이러한 종류의 읽기는 시스템 호출 및 프로그래밍 도구입니다.
하지만! 읽기를 전혀 사용하지 마십시오. "데이터"가 있고 배열이 필요합니다.
IFS=',';my_array=( ${data[@]} )
for item in "${my_array[@]}"; do echo "$item"; done
pig
cow
horse
rattlesnake