%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
다음은 무엇을 의미합니까?
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
저는 특히 이 부분에 관심이 있습니다.
varible=$(...)
괄호가 하위 프로세스를 실행하는 데 사용된다는 것을 알고 있지만 괄호를 와 함께 사용하면 어떻게 될까요 $
?
답변1
Bash 매뉴얼에서 ( man bash
):
명령 대체 명령 대체를 사용하면 명령 출력을 대체할 수 있습니다. 명령 이름. 두 가지 형태가 있습니다: $(명령) 또는 '명령' Bash는 서브셸에서 명령을 실행하여 확장을 수행합니다. 환경 및 명령 대체를 표준으로 대체 후행 줄 바꿈이 모두 제거된 명령의 출력입니다. 임베디드 줄 바꿈은 제거되지 않지만 워드 프로세스 중에 제거될 수 있습니다. 나뉘다. 명령 대체 $(cat 파일)은 다음으로 대체될 수 있습니다. 동일하지만 더 빠른 $(< 파일).
(이는 모든 Bourne 유사 쉘(예: , , 등)에 작동하며 sh
NUL 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/