쉘 스크립트에서 $ {0 % / *}의 기능은 무엇입니까?


17

이것이 멍청한 질문이라면 죄송하지만 성공하지 않고 검색했습니다.

두 번째 줄은 정확히 무엇을합니까? :

#!/bin/sh
cd ${0%/*} || exit 1

첫 번째는 shebang이고 두 번째는 디렉토리를 변경하려고 시도하지만 혼란스러운 부분은 ${0%/*}입니다.

그 두 번째 줄을 설명해 주시겠습니까?


2
Andrea가 대답에서 설명했듯이 $ {0 % / *}는 스크립트 이름을 호출하는 동안 접두어가 붙은 디렉토리 경로로 변환됩니다. 대안은 다음 dirname과 같은 내장 명령 을 사용하는 것입니다.$(dirname $0)
항상 배우는

@alwayslearning : 사용중인 쉘 및 쉘 버전은 무엇입니까 dirname? 확실히 Ubuntu Trusty의 기본 셸 인 Bash v4.3.11에는 없습니다.
David Foerster

혼란에 대한 사과는 방금 dirname쉘 내장이 아닌지 확인 했습니다.
상시 학습

답변:


27

${0}스크립트의 첫 번째 인수입니다 (예 : 스크립트 이름 또는 경로). 로 스크립트를 시작하면 정확히 path/to/script.sh다음 과 같은 ${0}문자열이 path/to/script.sh됩니다.

%/*부분은의 값을 수정합니다 ${0}. /파일 이름 이 올 때까지 모든 문자를 가져 옵니다. 위의 예에서는 ${0%/*}입니다 path/to.

쉘에서 작동하는 것을 볼 수 있습니다.

$ x=path/to/script.sh
$ echo "${x%/*}"
path/to

Sh는 다른 많은 종류의 "매개 변수 대체"를 지원합니다. 예를 들어 경로 대신 파일 이름을 사용하는 방법은 다음과 같습니다.

$ echo "${x##*/}"
script.sh

일반적으로 %%%스트립 접미사 동안 ###스트립 프리픽스. 매개 변수 대체 에 대해 자세히 읽을 수 있습니다 .


2
이 "|| exit 1"은 불필요 해 보입니다 : dir $를 바꾸지 않겠습니까?
Josef Klimuk

2
이 구성은 매뉴얼에서 "일치하는 접두사 / 접미사 패턴 제거"로 문서화되어 있습니다. 또한 기억하는 좋은 방법은 #는 shift 3 ( $의 왼쪽 )이고 %는 shift 5 ( $의 오른쪽 )이며 적어도 미국 키보드에서는입니다.
chexum

1
@JosefKlimuk : 오류시 1이 아닌 상태 2로 종료 될 수 있기 때문에 필요할 || exit 1 있습니다 cd. 그러나 나는 그것이 유용하지 않다는 데 동의합니다 (일반적으로 프로그램은 특정 종료 상태에 신경 쓰지 않습니다). 아마도 이것은 더 큰 스크립트의 일부입니까?
Andrea Corbellini

1
@AndreaCorbellini 확실히 맞습니다. 거의 쓸모가있는 유일한 방법은 더 큰 스크립트의 일부입니다. 현재 디렉토리 만 변경하는 스크립트는 하나의 스크립트를 실행하는 쉘에만 영향을주기 때문에 아무런 영향을 미치지 않습니다. 부모 프로세스는 그것을 보지 못합니다.
hvd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.