在 bash 函數中將參數傳遞給 python -c ?

在 bash 函數中將參數傳遞給 python -c ?

我需要在 Bash shell 中列印 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'"shell 時,會將其解析為

  • python
  • -c
  • print 'foo'

所以 python 最終看到兩個參數。

當您運行時,pyt -c "print 'foo'"該行將python $@擴展為(相當於)python -c print 'foo',它被標記為

  • python
  • -c
  • print
  • foo

即 python 看到三個參數,並將運行命令print,其中字串foosys.argv[1]

您需要做的是使用 magic shell token: 而不是僅僅$@使用"$@"(它必須是雙引號)。這告訴 shell 將參數保持在一起;當您運行時pyt -c "print 'foo'",該行將python "$@"擴展為(相當於)python -c "print 'foo'"

相關內容