質問: bash関数内でパラメータをpython -c? 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'"(と同等)に展開されます。