
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パラメータがいくつかの効果は何も印刷されないことです。
何が足りないのでしょうか?
答え1
あなたは議論がどのように伝えられるかを誤解しています。
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 つの引数を認識し、 のprint
文字列を使用foo
してコマンド を実行しますsys.argv[1]
。
必要なのは、単に$@
を使用する代わりに、マジック シェル トークン : を使用することです"$@"
(二重引用符で囲む必要があります)。これにより、シェルは引数をまとめて保持するように指示されます。 を実行するとpyt -c "print 'foo'"
、行はpython "$@"
(と同等) に展開されますpython -c "print 'foo'"
。