linux shell 输入重定向错误

linux shell 输入重定向错误

我正在尝试了解如何在 Linux 中使用输入重定向。
我尝试使用 python 命令进行输入重定向。

首先我使用:

python -c "print('hello world')"

返回“hello world”

现在我想使用输入重定向做同样的事情。

我创建了一个名为的文件,execute 在其中写入以下行:

-c "print('hello world')"

然后我跑 python < execute ,我得到了

  File "<stdin>", line 1
    -c 'print("hello world")'
       ^
SyntaxError: invalid syntax

我究竟做错了什么?

答案1

如果您编写了以下行-c "print('hello world')",则说明您编写的 Python 语法不正确。因此,python 会抱怨语法无效。

在你的文件中写入有效的语法executepython 就不会再抱怨了:

$ cat execute 
print('hello world')

$ python < execute
hello world

虽然您尝试重定向,python < execute但肯定可以工作,但没有必要以这种方式工作。可执行文件 python 被编程为使用您添加到命令中的文件的名称作为脚本。因此,建议的工作方式是使用以下命令:

python execute

python将打开该文件execute并运行该文件中的命令。

答案2

我不认为你在争论这是否-c "print('hello world')"应该是一种正确的 Python 语法,因为它不是,而且你清楚地知道它是什么,因为你已经在第一个示例/方法中正确地使用了它……而是……

您试图理解为什么-c "print('hello world')"使用 shell 重定向运算符从文件重定向时的命令字符串<的解析方式与直接放在命令行本身时不同,不是吗?

好吧,如果你跟踪第一个方法,看看实际执行了什么,如下所示:

$ strace -e "execve" python3 -c "print('hello world')"
execve("/usr/bin/python3", ["python3", "-c", "print('hello world')"], 0x7ffcfec1b130 /* 53 vars */) = 0
hello world
+++ exited with 0 +++

...您会清楚地看到执行的二进制文件是作为选项和参数"/usr/bin/python3"传递的。"-c""print('hello world')"

但是,如果你像这样追踪第二种方法:

$ strace -e "execve" python3 < file 
execve("/usr/bin/python3", ["python3"], 0x7ffe6f7c4080 /* 53 vars */) = 0
  File "<stdin>", line 1
    -c "print('hello world')"
       ^^^^^^^^^^^^^^^^^^^^^^
SyntaxError: invalid syntax
+++ exited with 1 +++

...你可以清楚地看到它不是你所期望的(我们就把它留在这里吧) 并简单地说,shell 重定向有效,但它不会将选项和参数放在命令行本身,而是将所有文件内容提供给 Python 解释器。

将其与使用实际上可以将它们放置在命令行本身上的工具进行比较。xargs例如像这样:

$ cat file
-c "print('hello world')"
$
$ <file xargs python3
hello world

相关内容