我正在尝试了解如何在 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 会抱怨语法无效。
在你的文件中写入有效的语法execute
,python
就不会再抱怨了:
$ 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