이 형식은 무엇입니까 variable = $ (…)


9

다음은 무엇을 의미합니까?

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

나는이 부분에 관심이있는 particulalry입니다 :

varible=$(...)

괄호가 하위 프로세스를 실행하는 데 사용된다는 것을 알고 있지만 함께 사용하면 $어떻게됩니까?


3
bash를 사용하는 경우 : 맨 페이지를 통해 man bash명령 대체를 검색 하십시오
FloHe

답변:


16

Bash 매뉴얼 ( man bash)에서 :

   명령 대체
       명령 대체는 명령의 출력이
       명령 이름. 두 가지 형태가 있습니다 :

              $ (명령)
       또는
              `명령`

       Bash는 서브 쉘에서 명령을 실행하여 확장을 수행합니다.
       환경과 명령 대체를 표준으로 대체
       후행 줄 바꿈이 삭제 된 명령 출력. 임베디드
       줄 바꿈은 삭제되지 않지만 단어 중에는 제거 될 수 있습니다
       파편. 대체 명령 $ (cat file)은 다음과 같이 대체 할 수 있습니다.
       동일하지만 더 빠른 $ (<파일).

(이것은 마찬가지입니다 모든 본쉘, 즉 sh, ksh, zsh, bash등, 그리고 zsh이런 식으로 포함 된 NUL 문자로 캡처 데이터도 할 수있다)

명령

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

스크립트에있는 디렉토리의 이름을 지정하고 (모든 백 슬래시를 슬래시로 변경) 변수에 지정 basedir합니다. 표준 오류 스트림으로 출력되는 모든 오류, 경고 또는 기타 진단 메시지는 여전히 터미널에 표시됩니다 ( $(...)명령의 표준 출력 만 캡처).

쉘은 가장 안쪽 명령 대체를 실행하여 시작합니다.

echo "$0" | sed -e 's,\\,/,g'

이것의 결과는에 문자열로 주어 dirname지고 그 결과는 변수에 할당됩니다 basedir.

큰 따옴표는 단어 분리 또는 파일 이름 붙여 넣기가 수행되지 $0않도록하기위한 것입니다. 문자 또는 파일 이름 글 로빙 문자 (예 : ?또는 *)

일반적으로 항상 확장 (가변 확장, 명령 대체 및 산술 확장)을 인용하는 것이 좋습니다. 이것이 왜 좋은 아이디어인지에 대한 훌륭한 설명 은 이 질문과 그 답변 을 참조하십시오 .

스크립트가 다음과 같이 실행 된 경우

$ /usr/local/bin/script.sh

그런 다음 basedir의 값을 얻습니다 /usr/local/bin.

또는 Cygwin에서 :

$ bash c:\\Users\\Me\\script.sh

그런 다음 basedir의 값을 얻습니다 c:/Users/Me. 이 경우 명령 행의 이중 백 슬래시는 쉘에서 단일 백 슬래시를 이스케이프하는 것입니다. 의 실제 값은 $0입니다 c:\Users\Me\script.sh.

또 다른 사용하지 않고 같은 일을하는 방법 dirname, echo그리고 sed

basedir="${0//\\//}"
basedir="${basedir%/*}"

감사합니다. 기본적으로 가장 안쪽 괄호에서 파싱을 시작합니다. 맞습니까? 따옴표는 왜 사용됩니까?
Max Koretskyi

@Maximus 맞습니다. 추가 정보로 답변을 업데이트했습니다.
Kusalananda

어쩌면 당신은 "본의 모든 껍질에 적용됩니다"라고 말해야 할 것입니다. 그런 식으로 좀 더 명확
Sergiy Kolodyazhnyy

@Serg, Bourne 쉘 ( /bin/shSolaris 10 이하 와 같은 )은 지원하지 않습니다 $(...).
Stéphane Chazelas

@ StéphaneChazelas 나는 이것을 통합 할 것입니다.
Kusalananda

6

그것은 의미 실행 내부입니다 무엇 괄호 A의 서브 쉘반환 A와 그 귀하의 경우에 것을 할당에 varible.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.