bash 関数内で python -c にパラメータを渡しますか?

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パラメータがいくつかの効果は何も印刷されないことです。

何が足りないのでしょうか?

答え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'"

関連情報