나는 때때로 Python 스크립트가 직접 실행되지 않고 /foo/bar.py
쉘 스크립트에서 실행되는 것을 발견했습니다./usr/bin/python -O /foo/bar.py $@
네트워크 관리자가 그러한 예 중 하나입니다 wicd
. /usr/bin/wicd-gtk
다음을 시작하는 쉘 스크립트입니다 wicd-client.py
.
$ cat /usr/bin/wicd-gtk
exec /usr/bin/python -O /usr/share/wicd/gtk/wicd-client.py $@
이 추가 단계의 목적은 무엇입니까?
/usr/share/wicd/gtk/wicd-client.py
직접 실행하면(실행 가능하다면) 어떤 차이가 있나요?
답변1
(이하 내용은 순수한 추측입니다.)
당신이 가지고 있는 것은 Wicd의 패키지 버전이고, 패키지 관리자는 배포판의 Python 패키지 버전을 사용하여 이를 테스트했습니다. 그러나 /usr/share/wicd/gtk/wicd-client.py
다음 코드를 사용하여 작성되었습니다.
#!/usr/bin/env python
/usr/bin/env
특히 Python 프로그래밍을 수행하는 경우 상황은 다를 수 있습니다 . 패키저에서는 Wicd가 다른 Python 버전에서 실행되거나 다른 버전의 라이브러리를 사용하여 발생하는 문제의 가능성을 줄이기 위해 이를 방지할 수 있습니다.python
/usr/bin/python
그들이 만들고 싶어하는 다른 준비가 있을 수도 있습니다. wicd-gtk
Ubuntu 14.04에는 다음이 있습니다 /usr/bin/wicd-gtk
.
#!/bin/sh
# check_firstrun()
if [ ! -d "$HOME/.wicd" ]; then
mkdir -p "$HOME/.wicd"
fi
# Make sure the user knows WHEREAREMYFILES ;-)
if [ -e "/var/lib/wicd/WHEREAREMYFILES" ] && [ ! -L "$HOME/.wicd/WHEREAREMYFILES" ]; then
ln -s "/var/lib/wicd/WHEREAREMYFILES" "$HOME/.wicd/WHEREAREMYFILES"
fi
exec /usr/bin/python -O /usr/share/wicd/gtk/wicd-client.py $@
답변2
전체 스크립트를 게시하지 않았습니다. 스크립트는 실행되기 전에 다른 작업을 수행합니다 wicd-client.py
. 먼저 특정 디렉터리와 특정 기호 링크가 존재하는지 확인합니다.
# check_firstrun() if [ ! -d "$HOME/.wicd" ]; then mkdir -p "$HOME/.wicd" fi # Make sure the user knows WHEREAREMYFILES ;-) if [ -e "/var/lib/wicd/WHEREAREMYFILES" ] && [ ! -L "$HOME/.wicd/WHEREAREMYFILES" ]; then ln -s "/var/lib/wicd/WHEREAREMYFILES" "$HOME/.wicd/WHEREAREMYFILES" fi
그런 다음 -O
해당 옵션으로 Python을 실행하여 바이트코드를 최적화합니다. 이게 무슨 소용이 있는지 모르겠습니다.
래퍼 스크립트도 force /usr/bin/python
이지만 /usr/share/wicd/gtk/wicd-client.py
로 시작하므로 명령 검색 경로에 나타나는 첫 번째 스크립트를 #!/usr/bin/env python
선택합니다 . python
대부분의 시스템에는 아무런 영향이 없습니다.
이 스크립트에는 버그가 있습니다. 버그가 $@
있어야 합니다 "$@"
. 매개변수에 공백이나 와일드카드가 포함되어 있으면 래퍼 스크립트가 실패합니다 \[*?
.
/usr/share/wicd/gtk/wicd-client.py
존재 하는 한 ~/.wicd
수동으로 안전하게 실행할 수 있습니다. 그러나 데비안 패키지는 실행 가능하게 만들지 않습니다. 아마도 다른 배포판에서도 가능합니다.