在 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]

您需要做的是使用神奇的 shell 标记:而不是仅仅$@使用"$@"(必须是双引号)。这会告诉 shell 将参数保持在一起;当您运行 时pyt -c "print 'foo'",该行将python "$@"扩展为(等同于)python -c "print 'foo'"

相关内容