Bash 하위 셸에 대한 더 심층적인 정보를 조사하는 동안, 그것이 어떻게 작동하는지 이해하고 싶은 흥미로운 구현을 발견했습니다. 실행에는 변수에 문자열을 할당한 다음 다음과 같은 경우 해당 변수를 사용하는 작업이 포함됩니다 man
.원본 예시 링크. LESS
해당 예제에서 특정 변수가 사용되는 이유( 많은 배포판의 기본 man
호출기 ) 를 읽었지만 less
, 명령이 실행된 후 변수 할당이 어떤 종류의 구분 메타 문자 없이 작동하는지 이해할 수 없습니다.
LESS=+/'OPTIONS' man man
man
해당 섹션 바로 아래에 있는 명령의 매뉴얼 페이지를 엽니다 OPTIONS
. 너무 직접적으로 열려 있는 파일 에서 작동합니다 (이로 인해 변수가 "세션" 내에서 정규식 검색을 수행하는 것과 동일한 방식으로 사용된다고 less
믿게 됩니다 ). 변수 는 내보내지지 않으며 현재 쉘 환경에 저장되지 않습니다(실행 시 아무것도 반환하지 않음). 그러면 값을 어떻게 캡처합니까 ?LESS
less
less
LESS
echo $LESS
less
왜 이것이 작동하지만 그런 것은 작동하지 않습니까 foo='hello' echo $foo
? ;
이는 변수 할당과 명령 실행 사이에 명령 구분 기호( )가 있는 경우에만 작동합니다 . foo=+'hello' echo $foo
혹시 모르니 =+
Bash에서 뭔가를 시도해 보았지만 결과는 바뀌지 않았습니다.
어떤 설명이나 독서도 환영합니다!
답변1
이는 표준 기능입니다. 명령을 시작할 때 이 변수를 설정할 수 있으며 그러면 해당 명령에 대해 설정됩니다. 또한 보여준 예에서도 작동합니다 foo='hello' echo $foo
. 문제는 잘못된 방식으로 테스트하고 있다는 것입니다. 이것을 실행하면:
foo='hello' echo $foo
쉘은 변수를 확장합니다앞으로명령을 실행하십시오. 실제로 시작 시 설정되지 않기 때문에 (에코 없음) foo
이 됩니다 . echo
다음을 통해 볼 수 있습니다 set -x
.
$ set -x
$ foo='hello' echo $foo
+ foo=hello
+ echo
이제 작은 스크립트를 사용하여 변수를 셸에 보이지 않게 만들 때 발생하는 상황과 비교해 보세요.
$ cat ~/scripts/foo.sh
+ cat /home/terdon/scripts/foo.sh
#!/bin/bash
echo "The value of foo is:$foo"
이를 사용하여 변수를 에코하면 다음을 얻을 수 있습니다.
$ foo='hello' ~/scripts/foo.sh
+ foo=hello
+ /home/terdon/scripts/foo.sh
The value of foo is:hello
bash -c
주어진 명령을 호출하고 작은따옴표로 묶으면 동일한 작업을 수행할 수 있습니다. 그러면 호출 전에 변수가 보호되고 현재 셸에 의해 확장되지 않습니다 bash -c
.
$ foo='hello' bash -c 'echo $foo'
hello
$foo
하지만 큰따옴표는 표시되기 전에 확장되었음을 의미하기 때문에 실패합니다 bash -c
.
$ foo='hello' bash -c "echo $foo"
$
이 동작은 man bash
"환경" 섹션에 설명되어 있습니다.
The environment for any simple command or function may be augmented
temporarily by prefixing it with parameter assignments, as described
above in PARAMETERS. These assignment statements affect only the envi‐
ronment seen by that command.
설명서에도 자세한 설명이 있습니다.3.7.1 간단한 명령 확장