셸 스 크 립 트 의 pwd, source, $0 의 연결 구덩이 (iOS 자동화 패키지)

7481 단어
본 고 는 Shell 스 크 립 트 pwd, source, $0 의 연결 구 덩이 를 제 블 로그 에서 시 작 했 습 니 다.
목차
  • 서문
  • 구 덩이 를 밟 고 구 덩이 를 뛰 어 내 렸 다.
  • pwd 는 현재 경 로 를 가 져 오 는 것 입 니까?
  • source 가 일 으 킨 화/$0 도 거짓말
  • source/$0/pwd 상호 영향
  • BASH_SOURCE [0] 이 건 또 뭐야?
  • 노 봉 성?pwd 로 돌 아 왔 습 니 다!
  • 또 소스 의 구덩이!변수 이름!

  • 소결
  • 머리말
    오늘 은 이전 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 로 조작 을 하기 때문이다.
    해결 은 대략 다음 과 같다.
  • 호출 자로 서 가능 한 한 절대 경로 나 상대 경 로 를 사용 하여 다른 스 크 립 트 파일 을 호출 하고 source 를 사용 하지 않 습 니 다.또는 다른 스 크 립 트 파일 을 사용 하기 전에 경로 pwd 를 저장 하고 호출 후 pwd=`pwd` 돌아 갑 니 다.
  • 호출 자로 서 시작 하기 전에 pwd 파일 을 저장 하고 작업 을 수행 한 후에 cd 로 돌아 갑 니 다.

  • 또 소스 구덩이 야!변수 이름!
    후후 얼마 남지 않 았 으 니, 물건 을 좀 더 넣 어 라.
    # 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 자동화 컴 파일 을 실현 합 니 다.
    프로 그래 밍 을 재 미 있 는 취미 로 만 들 었 습 니 다!

    좋은 웹페이지 즐겨찾기