답변:
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%/*}"
/bin/shSolaris 10 이하 와 같은 )은 지원하지 않습니다 $(...).
varible=$(..)라는 명령 치환 더하지만, 쉘 명령을 실행하고 변수에 출력을 저장하거나 echo 명령을 사용하여 다시 표시 할 수 그것의 수단 아무것도. 예를 들어, 날짜 및 시간을 표시하십시오.
echo "Today is $(date)"
변수에 저장하려면 다음을 수행하십시오.
SERVERNAME=$(hostname)
자세한 정보 : https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/
man bash명령 대체를 검색 하십시오