저는 Ubuntu 16.04와 Bash를 사용하고 있으며 다음 내용을 읽으려고 합니다.위키피디아, 존재하다여기그리고여기, 그러나 쉘 스크립트, 특히 Bash에서 다음과 같이 "명령 대체"의 의미를 이해할 수 없습니다.
$(command)
또는
`command`
이 말은 무엇을 의미 하는가?
편집: 이 질문을 처음 게시했을 때 저는 이미 순수 교체 개념과 Linux 개념에 대해 알고 있었습니다.변수 대체(변수를 해당 값으로 대체하여) 그러나 어떤 이유로든 문서에서 이 셸 기능의 목적을 여전히 놓쳤습니다.
질문이 잠긴 후 내 답변
명령 대체는 명령을 실행하고 해당 명령을 수행하는 특수 구문을 사용하는 작업입니다.산출나중에 사용하기 위해 변수로 저장(저장)됩니다.
한 가지 예 date
:
thedate="$(date)"
그런 다음 다음을 사용하여 결과를 인쇄할 수 있습니다 printf
.
printf 'The date is %s\n' "$thedate"
- 명령 대체 구문은 입니다
$()
. - 명령 자체는 입니다
date
. $(date)
이것을 결합하면 그 값이 대체의 결과라는 것을 알 수 있습니다 (나중에 얻을 수 있습니다).구현하다).$thedate
나중에 사용할 수 있도록 이 값을 변수에 저장합니다 .printf
위의 명령에 따라 변수에 저장된 출력값을 표시하는데 사용합니다.
참고: \n
in은 printf
개행 문자입니다.
답변1
"명령 대체"는 명령을 실행하고 해당 명령의 출력이 명령의 텍스트를 바꾸도록 하는 기능에 대한 쉘 언어 이름입니다.
쉘 언어에는 이를 수행할 수 있는 다른 기능이 없습니다.
명령 대체, 즉 전체 $(...)
표현식은 다음과 같습니다.교체됨이는 출력을 통한 명령 대체의 주요 용도입니다.
명령 대체에 의해 실행되는 명령은 서브쉘에서 실행되는데, 이는 자체 환경을 가지며 상위 쉘의 환경에 영향을 미치지 않는다는 것을 의미합니다.
그러나 모든 서브쉘 실행이 명령 대체인 것은 아닙니다(끝 부분에 있는 추가 예제 참조).
서브셸에서 명령 대체를 보여주는 예:
$ s=123
$ echo "hello $( s=world; echo "$s" )"
hello world
$ echo "$s"
123
여기서 변수는 s
string 으로 설정됩니다 123
. 다음 줄에서는 echo
명령 대체 결과가 포함된 문자열이 호출됩니다. 명령 대체는 s
문자열로 설정되고 world
해당 문자열을 에코합니다. 문자열 world
은명령 대체의 명령 출력따라서 아래에서 실행하면 위의 두 번째 줄 이 터미널에서 생성되는 set -x
으로 확장되는 것을 볼 수 있습니다 .echo 'hello world'
hello world
$ set -x
$ echo "hello $( s=world; echo "$s" )"
++ s=world
++ echo world
+ echo 'hello world'
hello world
(명령 대체 subshell의 각 레벨에 추적 출력의 추가 프롬프트 레벨을 추가합니다 bash
. 다른 쉘에서는 이 작업을 수행하지 않을 수 있습니다.)+
마지막으로 명령 대체의 명령은 호출 쉘의 값에 영향을 주지 않기 때문에 자체 하위 쉘에서 실행된다는 것을 보여줍니다 s
(값은 s
여전히 동일 123
하지만 가 아님 world
).
다음과 같이 서브셸에서 명령을 실행해야 하는 다른 상황도 있습니다.
echo 'hello' | read message
에서는 bash
이 lastpipe
옵션을 설정하지 않는 한(비대화형 인스턴스에서만) read
하위 쉘에서 실행됩니다. 즉, $message
상위 쉘에서는 변경되지 않습니다. 즉, echo "$message"
위 명령 다음에 실행하면 빈 문자열(또는 임의의 문자열)이 에코됩니다. 값) $message
이 이전입니다.
프로세스 대체는 bash
서브셸에서도 수행됩니다.
cat < <( echo 'hello world' )
이는 명령 대체와도 다릅니다.
답변2
a=$(command)
결과값을 command
변수에 저장합니다.
정말 더 이상 없습니다.
참고로 저는 다음과 같이 믿습니다.
a=`command`
더 이상 사용되지 않으며 위와 동일한 의미를 갖습니다.