web-dev-qa-db-ja.com

端末出力なしでコマンドを実行する

質問の背景を少しお話ししましょう。リンクの操作にマクロを使用できるターミナルRSSリーダーnewsboatを使用しています。たとえば、cd ~/videos && youtube-dl %uを実行するマクロがあります。これにより、YouTubeビデオが~/videosにダウンロードされます。ただし、youtube-dlの出力は、ダウンロードが完了するまで端末に出力され、今回はnewsboatの使用を続行できません。

コマンドを「どこか別の場所で」実行して、実行元の端末をすぐに使い続けることができるように、コマンドをどのようにフレーズできるのかと思います。

3
John Dorian

出力がまったく必要ない場合は、/ dev/nullにリダイレクトします。

yourcommand > /dev/null 2>&1

それ以外の場合は、ファイルにリダイレクトできます。

yourcommand > /somwhere/file 2>&1

また、別のアプリケーションからコマンドを実行し、ニュースリーダーをすぐに使用したい場合は、コマンドをバックグラウンドで実行することをお勧めします。このニュースボートでどのように機能するかはわかりませんが、シェルでは&でプログラムをバックラウンドに送信できます

yourcommand > /somwhere/file 2>&1 &
4
redseven

コマンドをバックグラウンドでサイレントに実行し、後でターミナルが閉じられても「存続」するには、分離モードでscreenを使用します。

screen -dm your_command(-s)

executeを実行するコマンドでscreenを再接続するには

screen -r

再接続された画面を切り離すには、CTRL+A+Dを押します。

screenがない場合は、Nohupを使用してコマンドを実行する必要があります。このため、screenユーティリティのように、後でターミナルが閉じられた場合にプロセスが実行されます。

Nohup your_command(-s) &>/dev/null  &
2
Bob

あなたの質問はあることを尋ね始めるが、それから別のことについて尋ねることになる。

最初に尋ねるのは、出力を破棄することです。これはリダイレクトで簡単に行えます:

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

次に尋ねるのは、「どこか別の場所で」コマンドを実行して、ターミナルを引き続き使用できるようにすることです。これは「ジョブ制御」と呼ばれます。

シェルの&コマンドセパレーターを使用して、任意のコマンドをバックグラウンドで実行できます。次の2つのコマンドの動作を比較します。

$ 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を使用したジョブ制御についてかなり良い読み物を持っています。

1
DopeGhoti