쉘에 의해 호출된 프로그램은 쉘 변수를 상속받습니까?

쉘에 의해 호출된 프로그램은 쉘 변수를 상속받습니까?

이 쉘 스크립트가 있는 경우

str="A tremor in the Force.
The last time I felt it was in the presence of my old master."

cat <<< "$str"

내 이해는 명령이

cat <<< "$str"

/bin/cat프로그램을 호출 하고 인수를 전달하도록 쉘에 지시합니다 $str. 큰따옴표는 $str쉘이 변경되지 않은 인수를 전달하도록 보장합니다. 그렇다면 cat프로그램에서 얻은 변수가 $str변경되지 않은 경우 변수의 값을 알아야 합니까? 내 질문은 쉘이 환경에서 선언된 변수를 호출하는 다른 시스템 프로그램에 전달합니까?

답변1

쉘은 환경에서 선언된 변수를 호출하는 다른 시스템 프로그램에 전달합니까?

네, 하지만 의 경우는 아닙니다 cat <<< "$str".

Unix 계열 운영 체제에서는 대부분의 새로운 프로그램이 execve()시스템에서 다음과 같은 이유로 실행됩니다.

int execve(const char *filename, char *const argv[], char *const envp[]);

셸은 execv프로그램을 실행하는 데 사용됩니다. 기본적으로 셸은 envp명령줄 인수가 전달되는 방식과 유사하게 의 모든 환경 변수를 전달합니다 argv. 개념적으로 는 envp문자열의 배열이며 각 문자열의 형식은 입니다 NAME=value.

man 2 execve전체 프로세스는 매우 명확하게 설명되어 있으며 작업 예제 코드가 포함되어 있습니다.

의 경우 cat <<<"$str"쉘은 caton cat의 표준 입력에 "$str"을 제공하므로 cat이름이 지정된 변수는 str이전에 쉘에서 내보낸 경우(예: 호출을 통해)를 제외하고는 볼 수 없지만 두 변수가 무엇인지 알 수 있는 방법은 없습니다 export str. cat변수는 관련되어 있습니다.

<<<"Here String"과 쉘 확장입니다. bash매뉴얼 페이지 에서 :

단어는 중괄호 확장, 물결표 확장, 매개변수 및 변수 확장, 명령 대체, 산술 확장 및 따옴표 제거를 거칩니다. 경로 이름 확장 및 토큰화가 수행되지 않습니다. 결과는 표준 입력의 명령에 단일 문자열로 제공됩니다.

여기서 String은 전통적인 관용구와 유사합니다.

echo "$str" | cat

난 그것을 추천 해. 실제로 둘 다 표준 입력 끝에 개행 문자를 추가합니다. 출력이 어떤 방식 으로든 수정되지 않는 한 두 방법 모두 동일하다고 생각합니다 echo(문자열의 내용에 따라 달라질 수 있으므로 더 안전한 버전은 그렇지 printf '%s' "$str"않습니다 echo).

printf '%s' "$str" | cat귀하의 경우에는 많은 쉘 중 하나만을 사용하여 스크립트 실행을 잠그지 않고도 가장 이식성이 뛰어나고 다재다능하며 이해하기 쉽기 때문에 이것을 사용하겠습니다 . POSIX 매뉴얼 페이지를 쉘 스크립트의 문서로 사용하는 경우 sh학습해야 할 내용이 더 적고, 배운 내용은 모든 Bourne 쉘 파생물에 적용됩니다.

답변2

쉘에 의해 호출된 프로그램은 쉘 변수를 상속받지 않습니다. 환경 변수만 상속합니다. 변수를 작성하면 export str(또는 덜 일반적인 방법으로) 변수가 환경에 할당되는 것이 아니라 환경에 배치됩니다.

cat어쨌든 환경 변수는 신경 쓰지 않습니다.

이 명령 cat <<< "$str"은 에 인수가 전달되지 않습니다 cat. cat인수 없이 호출되지만 쉘이 변수 값 str과 개행 문자를 쓰는 파이프에 연결된 표준 입력을 사용합니다. 프로세스 는 (마지막 개행 문자) 를 보지 cat못했습니다 . 큰따옴표는 변수 값의 토큰화 및 와일드카드를 방지합니다. 즉, 값으로 확장됩니다 . 큰따옴표와 작은따옴표를 혼동할 수 있습니다. 즉, 마지막 개행 문자가 포함된 5개의 문자열을 입력으로 전달하는 것입니다 .$strA tremor … my old master$str"$str"strcat <<< '$str'$strcat

관련 정보