달러 기호와 괄호 안에 명령을 넣는 것은 쉘에서 무엇을 의미합니까 : $ (command)


110

셸에서 다음 코드 줄을 이해하고 싶습니다. 현재 작업 디렉토리를 가져 오는 데 사용됩니다. $(variable)이름이 변수 이름 내부의 값을 반환 한다는 것을 알고 있지만 무엇 $(command)을 반환해야합니까? 명령을 실행 한 후 값을 반환합니까? 이 경우 `명령을 실행하는 데 사용할 수 있습니다 .

CWD="$(cd "$(dirname $0)"; pwd)"

다른 버전의 셸에서도 다음 코드 줄에서 동일한 출력을 가져올 수 있습니다.

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

$(cd..및 의 의미를 이해할 수 없습니다 $(dirname.

아무도이 명령이 어떻게 실행되는지 알아낼 수 있습니까?


1
그리고 여기의 장점 / 단점에 대한 질문입니다 $()대가 ``: stackoverflow.com/questions/9449778/...
없음

답변:


115

의 사용 $${HOME}가정의 가치를 제공합니다. $like의 사용법은 $(echo foo)서브 쉘의 괄호 안에있는 모든 것을 실행하고 값으로 반환하는 것을 의미합니다. 내 예에서는 표준 출력에 쓸 foo것이므로echofoo


37
예; $(...)역 따옴표를 사용하는 것보다 명령을 작성하는 더 좋은 방법입니다. 쓰기 고려 : gcclib=$(dirname $(dirname $(which gcc)))/lib역 따옴표 사용. Markdown에서 수행하는 데 어려움을 겪기 전에도 중첩 된 명령의 역 따옴표를 이스케이프해야하므로 $(...)표기법 을 사용하지 않는 것이 더 어렵습니다 .
Jonathan Leffler

7
기술적으로 $(echo foo)는 서브 쉘이 아닌 명령 대체를 작성합니다. 다른 현재 답변은 이것을 맞습니다. 나는 명령 대체가 일종의 서브 쉘에서 실행된다고 생각하지만 여전히 다른 개념입니다.
trysis

4
@trysis-명령 대체는 확실히 서브 쉘에서 실행 되므로 주목할 가치가 있습니다.
Eliran Malka

2
백틱이 $ ()와 동일한 결과를 생성한다는 것을 이해하지만 그 차이는 순전히 외형입니까? $ ()가 더 읽기 쉽다는 점을 제외하고 하나를 사용하는 이유가 있습니까?
Mitchell Tracy

2
"$ (echo foo)와 같은 $의 사용은 서브 쉘의 괄호 안에있는 모든 것을 실행하고 값으로 리턴 함을 의미합니다." ...이 명령 $(echo foo)은 괄호에서 반환내용실행 하려고하기 때문에 혼란 스럽 습니다. 먼저 실행 echo foo한 다음 foo오류를 제공하는 실행 을 시도합니다
Accountant م

21
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

아무도이 명령이 어떻게 실행되는지 알아낼 수 있습니까?

명령의 다른 부분을 살펴 보겠습니다. BASH_SOURCE소스 파일 이름을 포함하는 bash 배열 변수입니다. 따라서 "${BASH_SOURCE[0]}"스크립트 파일의 이름을 반환합니다.

dirname파일 이름에서 마지막 구성 요소 를 제거하는 GNU coreutils에서 제공하는 유틸리티 입니다. 따라서 말하여 스크립트를 실행하면 bash foo, "$( dirname "${BASH_SOURCE[0]}" )"반환 .됩니다. 당신이 말하면 bash ../foo, 그것은 돌아올 것입니다 ..; 위해 bash /some/path/foo그것을 반환 것입니다 /some/path.

마지막으로 전체 명령 "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"은 호출되는 스크립트가 포함 된 절대 디렉토리를 가져옵니다.

$(...) 명령 대체를 허용합니다. 즉, 명령의 출력이 명령 자체를 대체하고 중첩 될 수 있습니다.


1
파티에 3 년 늦어서 미안하지만 성명서가 작동 하는 이유 를 설명해 주 시겠습니까? 당신은 말했다 dirname(현재 작업 디렉토리에 대한 상대 또는 절대) 파일의 경로가 실행 반환, cd그 디렉토리에 PWD를 변경하고 pwd현재 작업 디렉토리의 절대 경로를 출력합니다. 그러나 그들은 왜 합류 &&합니까? 그리고 무엇을 것이다 DIR(가) 경우 보유 cd하지?
기독교

2
@Christian 은 잘못된 디렉토리가 아닌 비어있는 것처럼 실패 할 경우 실행되지 &&않도록합니다 . pwdcdDIR
Charles Duffy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.