所以我只是< ./somefile.txt
在 shell 中执行,它似乎没有执行任何操作(文本文件具有有效的 Linux 命令)。那么文本文件的内容被重定向到哪里呢?我只是猜测为空,但我不确定。
操作系统:Ubuntu 12.04
答案1
所以我只是在linux shell中执行“< ./somefile.txt”,
在bash
、dash
和类似的 shell 下,不执行一个命令。那仅仅分配 somefile.txt
到标准输入。这不会有任何结果,因为除非您提供命令,否则不会使用 stdin。
要使用 stdin 进行某些操作,请尝试,例如cat
:
cat <./somefile.txt
由于cat
将标准输入回显到标准输出,您将看到终端中显示的文件。
另一方面,如果您确实想要执行脚本,则可以在子 shell 中执行此操作,如下所示:
bash ./somefile.txt
或者,如果 (a)somefile.txt
已设置其可执行位 ( chmod +x somfile.txt
) 且 (b) 是纯sh
兼容的,或者第一行具有适当的 shebang,例如#!/bin/bash
,则:
./somefile.txt
或者,在当前 shell 中执行它(IE获取它),运行:
. ./somefile.txt
或者:
source ./somefile.txt
通常,如果希望脚本更改当前工作目录和当前 shell 环境的其他方面,则可以获取脚本。如果你没有这样的副作用,那就不要采购它;在子 shell 中执行它。
高级用法
@StéphaneChazelas 指出这<./somefile.txt
对于测试文件是否./somefile.txt
可读很有用。例如,如果./somefile.txt
不可读,则使用代码 1 退出:
<./somefile.txt || exit 2
这是可行的,因为 shell 只能将./somefile.txt
其分配给可读的 stdin。如果不是,shell 将显示一条错误消息并返回代码 1。该代码会触发“or ( ||
) 子句,在本例中,该子句将使脚本以代码 2 退出。对于相同的测试将是:
[ -r "./somefile.txt" ] || exit 2
答案2
这取决于外壳。对于 zsh,这在“无命令重定向”部分中进行了描述。默认情况下,READNULLCMD
将用作命令,默认为more
.
答案3
您拥有的是带有重定向的空命令。您尚未指定您正在使用哪个 shell。 vinc17 解决了 zsh 中空命令的处理问题。在 bash 中,空命令只是不执行任何操作;就像一个空脚本。如果您阅读以下内容的字里行间,您可以推断出这一点Bash 参考手册:
当执行一个简单的命令时,shell 会执行以下扩展、赋值和重定向, 从左到右。
︙
如果没有命令名结果,则执行重定向,但不影响当前的shell环境。重定向错误会导致命令以非零状态退出。
(强调。)换句话说,
<文件名
打开文件名然后什么也不做。如果打开失败,shell 会输出错误消息。无论哪种方式,都会适当设置退出状态 ( $?
):0 表示成功,1 表示失败。这相当于
睡眠 0 <文件名
因为sleep
不读取其标准输入。
稍微有趣的变体是
>文件名
这创造了文件名然后什么也不做。这是创建空文件的便捷方法。