私は時々Pythonスクリプトが直接実行されず、/foo/bar.py
シェルスクリプトで実行されることがわかりました。/usr/bin/python -O /foo/bar.py $@
ネットワーク管理者はそのような例の1つです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
で安全に実行できます。ただし、Debian パッケージは実行可能にしません。おそらく他のディストリビューションでも可能です。