让我介绍一下我的问题的背景。我正在使用终端 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
。