web-dev-qa-db-ja.com

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効果があるようです—何も印刷されません。

何が足りないのですか?

3
JK Laiho

あなたは議論がどのように渡されるかを誤解しています。

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'"(と同等)に展開されます。

2
Gabe