android 소스를 받아보려 하는데, repo 라는 python 프로그램을 만들어놨으니 사용하라고 한다.
그래서 봤는데, 첫 줄을 보고 shell programming 인가 했다.
아래 경로에서 다운 받을 수 있다.
https://dl-ssl.google.com/dl/googlesource/git-repo/repo
#!/bin/sh
## repo default configuration
##
REPO_URL='https://gerrit.googlesource.com/git-repo'
REPO_REV='stable'
# Copyright (C) 2008 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
magic='--calling-python-from-/bin/sh--'
"""exec" python -E "$0" "$@" """#$magic"
"""exec" python -E "$0" "$@" """#$magic"
잘 보면 shell program 에서 exec 를 이용하여 python 을 부르면서 인자로 자기자신($0)을 넘겨준다. 신기하게도 해놨다. 이 부분에서 핵심은 저 쌍 따옴표에 있다.
쌍따옴표를 bash 명령어 부분에 쳐놓음으로써 bash 에서는 실행되고, python 에서는 무시하도록 해놨다.
쌍따옴표를 지우면 python runtime error 가 날 것이다.
exec command
1개 이상의 sub 프로세스들을 실행하게 만든다
exec" python -E "$0" "$@" """#$magic
python option
-E :ignore PYTHON* environment variables (such as PYTHONPATH)
$0
command 를 가리킨다. 예를 들어
cp A B를 한다면 cp 가 $0 가 된다.
$@
모든 argument 를 가리킨다.
cp A B인 경우에는 A B 를 가리키며,
cp A A A A A A인 경우에는 A A A A A A 가 된다.
댓글 없음:
댓글 쓰기