쉘 스크립트에서 $ {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.