执行命令而不输出终端

执行命令而不输出终端

让我介绍一下我的问题的背景。我正在使用终端 RSS 阅读器newsboat,它允许使用宏来操作链接。例如,我正在运行一个宏cd ~/videos && youtube-dl %u,它将把 YouTube 视频下载到~/videos。但是, 的输出youtube-dl将打印在我的终端中,直到下载完成,此时我无法继续使用newsboat.

我想知道如何表达该命令,以便它在“其他地方”执行,以便我可以立即继续使用运行它的终端。

答案1

如果您根本不需要输出,则将其重定向到 /dev/null

yourcommand > /dev/null 2>&1

否则你可以重定向到一个文件:

yourcommand > /somwhere/file 2>&1

当您从另一个应用程序运行该命令并且希望立即使用新闻阅读器时,您可能希望在后台运行该命令。我不确定它在这条新闻船上是如何工作的,但是在 shell 中你可以使用 & 将程序发送到后台

yourcommand > /somwhere/file 2>&1 &

答案2

要在后台静默运行命令,即使终端随后关闭,该命令也将“生存”,请screen在分离模式下使用:

screen -dm your_command(-s)

screen使用运行执行的命令重新连接

screen -r

要分离重新连接的屏幕,请按CTRL+A+D

如果没有,screen您应该使用 执行命令nohup,因此如果终端随后关闭,该进程将运行,就像screen实用程序一样:

nohup your_command(-s) &>/dev/null  &

答案3

你的问题一开始问一件事,然后又问另一件事。

您问的第一件事是丢弃输出。这可以通过重定向轻松完成:

$ echo hello 1> /dev/null 2>&1

您询问的第二件事是在“其他地方”运行命令,以便您可以继续使用终端。这称为“作业控制”。

您可以使用 shell 的命令分隔符在后台执行任何命令&。比较以下两个命令的行为:

$ sleep 5
$ sleep 5 &

如果作业已经在运行,并且您需要使用终端执行其他操作,并且希望作业完成,则可以使用Ctrl-Z暂停作业并bg告诉它在后台继续:

$ (sleep 10; echo hello)
^Z
[1]+  Stopped                 ( sleep 10; echo hello )
$ bg
[1]+ ( sleep 10; echo hello ) &
$ echo farewell
farewell
$ fg
( sleep 10; echo hello )
hello

这个链接有一些关于作业控制的相当好的读物bash

相关内容