셸 스 크 립 트 의 pwd, source, $0 의 연결 구덩이 (iOS 자동화 패키지)
목차
오늘 은 이전 iOS 자동화 스 크 립 트 를 다시 쓰 고 Bugly 에 기호 표 파일 을 자동 으로 업로드 하 는 기능 을 추가 했다.결국 셸 의 재 미 있 는 구덩이 몇 개 를 만 났 다.
다음 과 같은 예 로 간략화 합 니 다.
/Users/zack/Desktop/a.sh/Users/zack/Desktop/B/b.sh/Users/zack/Desktop/B/C/c.sh
위의 경로 구조 와 같은 세 개의 스 크 립 트 파일 a. sh, b. sh, c. sh 가 있 습 니 다.
B 디 렉 터 리 에 있 는 파일 은 다른 사람 에 게 호출 된 것 이 고 b. sh 는 c. sh 를 호출 합 니 다.데스크 톱 에 a. sh 가 b. sh 를 호출 했다 고 가정 합 니 다.
실제 과정 에서 많은 스 크 립 트 파일 을 썼 는데 비교적 복잡 하 다. 사실은 구 덩이 를 조사 하 는 것 은 아래 에서 말 한 것 처럼 그렇게 간단 하지 않 고 멘 붕!
구 덩이 를 밟 고 구 덩이 를 뛰어넘다.
이 어 작은 재 미 있 는 구덩이 밟 기 를 시작 했다.
pwd 는 현재 경 로 를 가 져 오 는 것 입 니까?
우선 a. sh 호출 b. sh
# a.sh
/Users/zack/Desktop/B/b.sh
c. sh 호출
# b.sh
C/c.sh
c. sh 아무 거나 해 요.
# c.sh
echo "I'm c.sh."
멀쩡 해 보 여요. 그 렇 죠?
/Users/zack/Desktop/B/b.sh: line 1: C/c.sh: No such file or directory
c. sh 를 못 찾 겠 어 요?왜?b. sh 는 C 디 렉 터 리 와 같은 등급 이 아 닙 니까?
생각 해 봐.나 는 다른 사람 에 게 사용 하 는 도구 이다. 그러면 나 는 a. sh 가 어디에서 나의 b. sh 를 호출 할 지 모른다.좋아, 그럼 내 가 절대 경 로 를 추가 할 게.
# b.sh
`pwd`/C/c.sh
또 문제 있어?그래, 네 짐작 이 맞다.
/Users/zack/Desktop/B/b.sh: line 1:/Users/zack/Desktop/C/c.sh: No such file or directory
그래, 왜
/Users/zack/Desktop/C/c.sh
이 경로 지?인쇄 해 주세요 `pwd`
. 네 /Users/zack/Desktop
.새우이것 은 현재 작업 디 렉 터 리 를 가 져 오 는 것 이 아 닙 니까?내 가 귀신 을 쳤 나 봐!아니오, 저 는 유물주의 자 입 니 다!다시 생각해 보면... 이것 은 a. sh 의 경로 입 니 다. 즉, 이것 은 호출 자 와 관련 이 있 습 니까?
인터넷 에서 도 모 는 이 걸 로
dirname
가 져 오 라 고 했 어 요.# b.sh
`dirname $0`/C/c.sh
결 과 를 보다.
I'm c.sh.
와, 진짜 된다. 도 모 님 감사합니다!
$0
주어진 경로 의 디 렉 터 리 부분 을 가 져 오 는 데 사 용 됩 니 다. dirname
셸 자체 의 파일 이름 입 니 다.코드 계속 써.
source 가 일 으 킨 화/$0 도 거짓말 을 합 니 다.
source 로 다른 셸 스 크 립 트 파일 을 호출 할 수 있 음 을 발견 하 였 습 니 다.해 봐.
# b.sh
source `dirname $0`/C/c.sh
실행 해 봐./a. sh.그 럴 수도 있 지.그리고 c. sh 를 고 쳐 요.
# c.sh
echo "I'm c.sh."
echo `dirname $0`
이때 두 번 째 줄 인쇄 는 c. sh 가 있 는 경로 일 거 예요. 그 렇 죠?
아니, 잘 못 했 어!!하하 하!
I'm c.sh./Users/zack/Desktop/B
왜 B 목록 이에 요?마 땅 히
$0
해 야 하지 않 겠 습 니까?나 는 책 을 적 게 읽 으 니 나 를 속 이지 마라!!인쇄 해 주세요
/Users/zack/Desktop/C
.# c.sh
echo "I'm c.sh."
echo `dirname $0`
echo $0
다음은 b. sh 가 source 를 사용 한 다음:
I'm c.sh./Users/zack/Desktop/B/Users/zack/Desktop/B/b.sh
다음은 b. sh 가 직접 경 로 를 사용 한 다음 입 니 다.
I'm c.sh./Users/zack/Desktop/B/C/Users/zack/Desktop/B/C/c.sh
읊다, 읊조리다마침내 너 를 잡 아 냈 다!소스 를 사용 하면
$0
달라 질 수 있 습 니 다.다음은 시험 포인트, 기억 해!!
source 명령 은 새로운 셸 이 생기 지 않 고 현재 셸 에서 모든 명령 을 수행 합 니 다.
source FileName, 역할: 현재 bash 환경 에서 FileName 의 명령 을 읽 고 실행 합 니 다.
source 는 이 셸 에서 실행 되 기 때문에 결 과 를 볼 수 있 습 니 다.
절대 경 로 를 호출 하여 셸 을 실행 하 는 것 은 키 셸 에서 실행 되 기 때문에 실행 한 후에 부모 셸 에 반응 하지 않 았 습 니 다.
응, 알았어!source 에서 사용 하 는 스 크 립 트 는 현재 셸 프로 세 스에 서 진행 되 기 때문에
$0
여전히 현재 b. sh 입 니 다.그러면 이전 $0
은 현재 셸 프로 세 스 의 작업 디 렉 터 리 일 것 입 니 다. 이것 은 이해 할 수 있 습 니 다.a. sh 에서 b. sh 를 호출 하면 a. sh 는 어떠한 pwd
작업 도 수행 하지 않 았 고 b. sh 도 없 기 때문에 cd dir
는 여전히 a. sh 가 있 는 디 렉 터 리 입 니 다.source/$0/pwd 상호 영향
실험 을 해 보 자.
# b.sh
echo `pwd`
source `dirname $0`/C/c.sh
echo `pwd`
# c.sh
cd ..
echo "I'm c.sh."
이때 b. sh 는 무엇 을 인쇄 합 니까?
/Users/zack/Desktop I'm c.sh./Users/zack
b. sh 가 다시 이렇게 바 뀌 면?
# b.sh
echo `pwd`
`dirname $0`/C/c.sh
echo `pwd`
/Users/zack/Desktop I'm c.sh./Users/zack/Desktop
하하, 재 미 있 습 니 다. 이렇게 하면 이 몇 가지 물건 의 작용 과 영향 을 쉽게 이해 할 수 있 습 니 다!
BASH_SOURCE [0] 이 건 또 뭐야?
위의 문 제 는 여전히 해결 되 지 않 았 다.기 우 는 코드 한 줄 을 잃 어 버 렸 다.
echo "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
BASH 로현재 스 크 립 트 의 경 로 를 가 져 오 는 SOURCE [0]
FUNCNAME 과 비슷 한 또 다른 유용 한 상수 가 BASH 입 니 다.SOURCE 는 같은 배열 이지 만 첫 번 째 요 소 는 현재 스 크 립 트 의 이름 입 니 다.이것 은 source 에 있 을 때 매우 유용 합 니 다. source 에 있 는 스 크 립 트 에서 $0 은 부모 스 크 립 트 의 이름 이지 source 에 있 는 스 크 립 트 의 이름 이 아 닙 니 다.BASH소스 가 도움 이 될 거 야.유일한 유감 은 이 방법 은 모든 셸 이 이러한 상수 들 을 지원 하 는 것 이 아니 기 때문에 스 크 립 트 를 이식 할 수 있 는 기능 을 잃 게 할 수 있다 는 것 이다.
시도 해 보기:
# b.sh
`dirname $0`/C/c.sh
# c.sh
echo "I'm c.sh."
echo `dirname ${BASH_SOURCE[0]}`
결 과 는 다음 과 같다. 쾅 쾅!
I'm c.sh./Users/zack/Desktop/B/C
b. sh 를 다시 source. sh 로 바 꿉 니 다.
# b.sh
source `dirname $0`/C/c.sh
I'm c.sh./Users/zack/Desktop/B/C
굿!하하 하!해결 되 어 기쁘다!
노 봉 성?pwd 로 돌 아 왔 습 니 다!
source/$0/pwd 가 이 절 에 서로 영향 을 미 치 는 실험 을 통 해 알 수 있 듯 이 b. sh 가 source c. sh 를 사용 할 때 c. sh 에서 cd dir 는 밖의 pwd 에 영향 을 줄 수 있 습 니 다.c. sh 를 직접 호출 하면 cd dir 가 b. sh 로 돌아 가도 pwd 에 영향 을 주지 않 습 니 다.
내 가 어떻게 가능 한 한 노 봉 성 을 보증 합 니까?다른 사람 이 나 를 어떻게 호출 했 는 지 모 르 니까.잘 설계 되면 호출 자로 서 스 크 립 트 자체 의 역할 만 하고 다른 것 에 영향 을 주지 않 아야 합 니 다. 예 를 들 어 호출 자의 작업 디 렉 터 리 경로 등 입 니 다.
다른 측면 에서 제 가 호출 자로 서 호출 자가 제 작업 디 렉 터 리 경로 에 영향 을 미 치 는 것 을 어떻게 방지 합 니까?우 리 는 항상 pwd 로 조작 을 하기 때문이다.
해결 은 대략 다음 과 같다.
pwd
를 저장 하고 호출 후 pwd=`pwd`
돌아 갑 니 다.또 소스 구덩이 야!변수 이름!
후후 얼마 남지 않 았 으 니, 물건 을 좀 더 넣 어 라.
# b.sh
myPath=`dirname ${BASH_SOURCE[0]}`
echo $myPath
source ${myPath}/C/c.sh
echo $myPath
# c.sh
myPath=`pwd`
echo "I'm c.sh."
cd $myPath
그리고 c. sh 는 현재 경 로 를 저장 하고 마지막 으로 현재 경 로 를 되 돌려 줍 니 다.b. sh 는 하나
cd pwd
를 저장 하고 b. sh 를 호출 하여 각각 인쇄 합 니 다.인쇄 결과 가 같 을 것 같 습 니까?/Users/zack/Desktop/B I'm c.sh./Users/zack/Desktop
말 도 안 돼, 왜 지?c. sh 는 경로 에 영향 을 주지 않 을 거 야!이거 시험 해 봤 는데
못 맞 히 겠 지? c. sh 의 my Path 가 b. sh 를 덮 었 으 니까...
source c. sh 이후 c. sh 와 b. sh 는 같은 셸 프로 세 스에 서 실행 되 고 변수 도 공용 이기 때문에...
어떻게 해결 하지?네 임 스페이스 나 네 임 룰 을 통 해서 만 가능 하 죠!
작은 매듭
후후 이제 끝났어!
셸 스 크 립 트 는 매우 재 미 있 습 니 다. 가끔 은 귀 찮 거나 규범 에 맞지 않 지만, 예 를 들 어 스 크 립 트 파 라 메 터 를 가 져 오 거나 스 크 립 트 는 정형 으로 돌아 갈 수 밖 에 없습니다.늦 었 습 니 다. pwd, source, $0 등에 관 한 더 자세 한 지식 은 소개 하지 않 겠 습 니 다. 도 모 는 알 고 있 습 니 다.
자동화 컴 파일 스 크 립 트 도 우아 하고 아름 답 게 다시 썼 습 니 다!다음 과 같이:
function archive() {
}
function exportArchive() {
}
...
archive
exportArchive
publishToFirIfNeed
submitAppStoreIfNeed
sendEmail
모든 변 수 는 함수 에 넣 고 함수 마다 다른 스 크 립 트 파일 을 각각 호출 합 니 다.패키지 내 보 내기, fir 업로드, app Store 업로드, 메 일 보 내기 모두 단독 스 크 립 트 파일 로 나 뉘 어 각각 사용 할 수 있 습 니 다.전체 호출 파일 이 깔끔 하고 절차 도 뚜렷 하 며 가장 아래 에 있 는 다섯 개의 호출 을 하 는 것 입 니 다.
다음은 기 존 에 쓴 글 에 보 정 됩 니 다.: Shell 스 크 립 트 를 상세 하 게 해석 하여 iOS 자동화 컴 파일 을 실현 하고 개인 블 로그 에 제출 합 니 다. Shell 스 크 립 트 를 상세 하 게 해석 하여 iOS 자동화 컴 파일 을 실현 합 니 다.
프로 그래 밍 을 재 미 있 는 취미 로 만 들 었 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.