从文件中读取 URL 并在 Firefox 选项卡中打开它

6 command-line firefox xargs

PreTabs.txt 是我桌面上的一个文件,它只包含该行

google.com
Run Code Online (Sandbox Code Playgroud)

我想将该文件的内容通过管道传输到 Firefox,以便它会在新选项卡中打开 URL。

如果你执行cat PreTabs.txt | firefox,那
不应该和firefox [Contents of PreTabs.txt]?

UTF*_*F-8 3

管道传输与将参数传递给程序不同。

如果运行一个程序,就会创建一个进程。我在这里进行了简化,但基本上每个流程都有一个标准输入和一个标准输出。它通过标准输入(也许)接收输入,并在其标准输出(也许)产生输出。它们分别缩写为 stdin 和 stdout。

当您在终端中执行程序时,其标准输入是您在终端运行时输入的内容。其标准输出打印在终端上。

当您执行时,您要做的a | b就是执行两者a,但将的进程b的标准输出连接到 的进程的标准输入。也就是说,如果's 进程创建了输出,它将作为输入提供给's 进程,就像您要在单独的终端中执行和,并将其终端上的所有进程打印内容输入到您正在运行的终端中一样。嗯,差不多了。例如,您只能处理文本,而进程可以将任意数据传送到不同的进程。abababab

您可以通过将数据传输到 来测试这一点tee

例子:

echo foo | tee
Run Code Online (Sandbox Code Playgroud)

echo读取其参数并将其写入其标准输出。它的标准输出连接到 的tee标准输入。Tee 只是逐行从其标准输入中读取并将其输入写入其标准输出。这意味着“foo”将被打印到您的终端,因为这是tee进程的标准输出。

echo foo | tee | tee | tee
Run Code Online (Sandbox Code Playgroud)

当然也有同样的效果。

您可以做更多有用的事情,这也很简单:

echo foo | sha256sum
Run Code Online (Sandbox Code Playgroud)

这将计算并打印“foo\n”的 sha256sum。其中\n换行符,因为echo其输出以换行符结束,否则前面的示例将无法工作,因为tee不会看到换行符。

因此,您的命令使用参数cat PreTabs.txt | firefox执行,该参数导致将内容写入其标准输出。这个标准输出是标准输入,这意味着可以读取它。它没有必要这样做,也没有关于它应该如何表现的规则。看起来它要么不读它,要么读它然后忽略它。catPreTabs.txtcatfirefoxfirefox

如果要将参数传递给程序但该参数位于文本文件内,则可以使用反引号。成对反引号之间的命令会提前执行,并将其输出粘贴到外部命令中的该点。

例子:

echo bar > foo
echo `cat foo` > foobar
Run Code Online (Sandbox Code Playgroud)

第一行将“bar”写入文件foo(如果文件已存在,则覆盖文件的内容,否则创建一个新文件)。在第二行中,cat foo首先执行。它读取其参数foo并得知它应该读取foo的内容并将其打印到其标准输出上。然后将此标准输出粘贴到哪里

`cat foo`
Run Code Online (Sandbox Code Playgroud)

在第二行,所以第二行变成

echo foo > foobar
Run Code Online (Sandbox Code Playgroud)

它写入foo文件foobar

这实际上会导致 Firefox 做一些事情:

echo "stackexchange.com" > foo
firefox `cat foo`
Run Code Online (Sandbox Code Playgroud)

在 Firefox 中打开一个加载http://stackexchange.com 的新选项卡。

您说过,在您的情况下,它会加载其名称作为参数的文件,实际上我模糊地记得它过去的行为类似。明确地告诉它要做什么可能是一个更好的主意:

echo "stackexchange.com" > foo
firefox -new-tab `cat foo`
Run Code Online (Sandbox Code Playgroud)

这在手册页 ( man firefox) 中定义为:

   -new-tab url
          Open url in a new tab.
Run Code Online (Sandbox Code Playgroud)

当然,尽管您的 Firefox 版本可能会有所不同。