PreTabs.txt
是我桌面上的一个文件,它只包含一行
google.com
我想将该文件的内容导入 Firefox,以便它在新选项卡中打开 URL。
如果执行的话cat PreTabs.txt | firefox
,
那不应该和一样吗firefox [Contents of PreTabs.txt]
?
答案1
xargs
使用bashnohup
和命令相当容易实现&
。具体命令如下:
xargs bash -c 'nohup firefox $@ &' null < tabs.txt
使用如下测试文件:
$ cat tabs.txt
google.com
askubuntu.com
unix.stackexchange.com
其工作方式很简单:
- 重定向
tabs.txt
文件作为输入流到xargs
。 xargs
会将所有传入的项目视为参数并将它们传递给bash -c ''
命令。null
字符串仅用于设置参数$0
。它实际上可以是任何字符串,并且不相关。bash
将运行nohup firefox $@ &
,同时用 替换所有参数$@
。最终结果是我们打开 Firefox,并通过和将其从bash
的进程中移除nohup
&
答案2
管道与向程序传递参数不同。
如果您运行一个程序,就会创建一个进程。我在这里简化了,但基本上每个进程都有一个标准输入和一个标准输出。它通过标准输入接收输入(可能),并在其标准输出中产生输出(可能)。它们分别缩写为 stdin 和 stdout。
当你在终端中执行程序时,它的标准输入就是你在程序运行时输入到终端的内容。它的标准输出则打印在终端上。
执行时,您a | b
要执行和a
,但要将进程的b
标准输出连接到进程的标准输入。也就是说,如果进程创建了输出,它将作为输入提供给进程,就像您在不同的终端中执行和并将进程在其终端上打印的所有内容输入到您正在运行的终端中一样。嗯,差不多。例如,您只能执行文本,而进程可以将任意数据通过管道传输到不同的进程。a
b
a
b
a
b
a
b
您可以通过将数据传输到来测试这一点tee
。
例子:
echo foo | tee
echo
读取其参数并将其写入其标准输出。其标准输出连接到 的标准输入。Tee 只是逐行从其标准输入读取并将其输入写入其标准输出。这意味着“foo”将打印到您的终端,因为这是进程tee
的标准输出。tee
echo foo | tee | tee | tee
当然有同样的效果。
您还可以做更多有用的事情,而且非常简单:
echo foo | sha256sum
这将计算并打印“foo\n”的 sha256sum。\n
其中换行因为以echo
换行符结束其输出,否则前面的示例将无法工作,因为tee
不会看到换行符。
因此,您的命令使用参数cat PreTabs.txt | firefox
执行,该参数导致将内容写入其 stdout。此 stdout 是 stdin,这意味着可以读取它。它不必这样做,也没有规则规定它应该如何表现。看起来它要么不读取它,要么读取它然后忽略它。cat
PreTabs.txt
cat
firefox
firefox
如果您想要将参数传递给程序,但该参数位于文本文件中,则可以使用反引号。成对的反引号之间的命令会提前执行,其输出会粘贴在外部命令的该位置。
例子:
echo bar > foo
echo `cat foo` > foobar
第一行将“bar”写入文件foo
(如果文件内容已存在,则覆盖文件内容,否则创建新文件)。第二行cat foo
首先执行。它读取其参数foo
并得知应该读取foo
的内容并将其打印到其标准输出上。然后将此标准输出粘贴到
`cat foo`
在第二行,所以第二行变成
echo foo > foobar
将其写入foo
文件foobar
。
这实际上会导致 Firefox 做一些事情:
echo "stackexchange.com" > foo
firefox `cat foo`
打开新标签页并加载http://stackexchange.com在 Firefox 中。
您说,在您的例子中,它会加载以名称作为参数的文件,而我实际上依稀记得它过去的行为是这样的。明确告诉它要做什么可能是一个更好的主意:
echo "stackexchange.com" > foo
firefox -new-tab `cat foo`
在手册页 ( man firefox
) 中其定义如下:
-new-tab url
Open url in a new tab.
当然,您的 Firefox 版本可能会有所不同。