![쉘에 의해 호출된 프로그램은 쉘 변수를 상속받습니까?](https://linux55.com/image/78936/%EC%89%98%EC%97%90%20%EC%9D%98%ED%95%B4%20%ED%98%B8%EC%B6%9C%EB%90%9C%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%80%20%EC%89%98%20%EB%B3%80%EC%88%98%EB%A5%BC%20%EC%83%81%EC%86%8D%EB%B0%9B%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
이 쉘 스크립트가 있는 경우
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"
쉘은 cat
on 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개의 문자열을 입력으로 전달하는 것입니다 .$str
A tremor … my old master
$str
"$str"
str
cat <<< '$str'
$str
cat