이 형식 변수 =$(...)는 무엇입니까?

이 형식 변수 =$(...)는 무엇입니까?

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

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

저는 특히 이 부분에 관심이 있습니다.

varible=$(...)

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

답변1

Bash 매뉴얼에서 ( man bash):

   명령 대체
       명령 대체를 사용하면 명령 출력을 대체할 수 있습니다.
       명령 이름. 두 가지 형태가 있습니다:

              $(명령)
       또는
              '명령'

       Bash는 서브셸에서 명령을 실행하여 확장을 수행합니다.
       환경 및 명령 대체를 표준으로 대체
       후행 줄 바꿈이 모두 제거된 명령의 출력입니다. 임베디드
       줄 바꿈은 제거되지 않지만 워드 프로세스 중에 제거될 수 있습니다.
       나뉘다. 명령 대체 $(cat 파일)은 다음으로 대체될 수 있습니다.
       동일하지만 더 빠른 $(< 파일).

(이는 모든 Bourne 유사 쉘(예: , , 등)에 작동하며 shNUL ksh문자 zsh가 포함된 bash데이터 zsh도 이 방식으로 캡처할 수 있습니다.)

주문하다

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%/*}"

답변2

이것은 의미한다달리기안에 뭐가 들어있어?괄호안에서브쉘그리고반품그것은, 귀하의 경우에는 에 할당하십시오 varible.

답변3

varible=$(..)호출명령 대체이것이 의미하는 바는 쉘 명령을 실행하고 그 출력을 변수에 저장하거나 echo 명령을 사용하여 다시 표시하는 것입니다. 예를 들어 날짜와 시간을 표시하려면 다음을 수행하세요.

echo "Today is $(date)"

변수에 저장합니다.

SERVERNAME=$(hostname)

자세한 내용은:https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-할당-variable-command-output/

관련 정보