在 shell 中运行“< ./somefile.txt”有什么作用?

在 shell 中运行“< ./somefile.txt”有什么作用?

所以我只是< ./somefile.txt在 shell 中执行,它似乎没有执行任何操作(文本文件具有有效的 Linux 命令)。那么文本文件的内容被重定向到哪里呢?我只是猜测为空,但我不确定。

操作系统:Ubuntu 12.04

答案1

所以我只是在linux shell中执行“< ./somefile.txt”,

bashdash和类似的 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不读取其标准输入。

稍微有趣的变体是

>文件名

这创造了文件名然后什么也不做。这是创建空文件的便捷方法。

相关内容