Bashシェルにいる間にDjango設定の値を出力する必要があります。
基本的に、実行したいコマンドはpython -c 'from Django.conf import settings; print settings.MEDIA_ROOT'
です。ただし、特定のパスに移動してDjango_SETTINGS_MODULE
を渡す必要があるため、代わりに呼び出すことができるbash関数pyt -c [...]
ですべてをラップすると思いました。
私は過去に同様の状況で$@
をうまく使用したことがあるので、ここでも役立つことを望んでいました。しかし、私は今それを設定しているので、それは機能していません。
function pyt {
cd $PROJECT_ROOT # set elsewhere, parent dir of my_site
Django_SETTINGS_MODULE=my_site.settings python $@
cd $OLDPWD
}
pyt -c "print 'foo'"
と入力してテストすると、「foo」は出力されません。空白行はです。 python -c "print 'foo'"
はそれを正しく出力するので、ここでの私の関数と関係があります。
関数内にecho $@
を入れると、すべてのパラメーターが正常に出力されます。 Pythonインタープリターも開始されていません(pyt
と入力した場合)ので、-cパラメーターはsome効果があるようです—何も印刷されません。
何が足りないのですか?
あなたは議論がどのように渡されるかを誤解しています。
python -c "print 'foo'"
を実行すると、シェルはそれを解析して
python
-c
print 'foo'
したがって、pythonは2つの引数を表示することになります。
pyt -c "print 'foo'"
を実行すると、行python $@
は(同等の)python -c print 'foo'
に展開され、次のようにトークン化されます。
python
-c
print
foo
つまり、pythonは3つの引数を確認し、sys.argv[1]
に文字列print
を指定してコマンドfoo
を実行します。
必要なのは、魔法のシェルトークンを使用することです。$@
だけでなく"$@"
を使用します(二重引用符で囲む必要があります)。これは、シェルに引数をまとめるように指示します。 pyt -c "print 'foo'"
を実行すると、行python "$@"
がpython -c "print 'foo'"
(と同等)に展開されます。