exec コマンドの使用法にはどのようなものがありますか?

exec コマンドの使用法にはどのようなものがありますか?

私はexecコマンドを学習しています。コマンドはそれを開始したプロセスを置き換えることは知っていますexec。そのため、コマンドによって置き換えられたプロセスに戻ることはできませんexec

その目的は、それを開始したプロセスに戻ることを不可能にすることであると言えるでしょう。

execしかし、コマンドとして available のようなものを使用することの他の用途は何でしょうか?

答え1

この exec コマンドは、現在のシェル プロセスを指定されたコマンドに置き換えます。通常、コマンドを実行すると、新しいプロセスが生成 (フォーク) されます。このexec コマンドは新しいプロセスを生成しません。代わりに、現在のプロセスが新しいコマンドでオーバーレイされます。つまり、exec新しいプロセスを作成せずに、現在のシェルの代わりにコマンドが実行されます。

exec コマンドの最も一般的な用途は 3 つあります。

1. プロセスの置き換え

例1:bash新しいシェル を開くと

$ bash 

それはpstree次のようになります

├─gnome-ターミナル
        ├─bash───bash───pstree

以前のbashシェルはそのまま残っており、新しいbashシェルが利用できます。一方、新しいbashシェルを次のように開くと、

$ exec bash

ショーpstree

├─gnome-ターミナル
        ├─bash───pstree

ここで古いものbashが新しいものに置き換えられます。1 つのコマンドで複数のログインを終了する場合に特に便利です。より安全になり、誤ってターミナルを開いたままにしてしまう可能性がなくなります。見る1つのコマンドでルートとユーザーの両方から終了する

例2:ファイルを次のように開くことができます

$ exec vi filename.txt

終了するときにvi、シェルはすでに置き換えられているため、ターミナルを個別に閉じる必要はありません。vi を閉じるとすぐにターミナルも閉じられます。

2. シェルスクリプト内でのファイル記述子のリダイレクト方法

このexec コマンドは、ファイル記述子を動的に開いたり、閉じたり、コピーしたりするシェル スクリプトでも使用できます。これにより、コマンド呼び出し文字列の代わりに、シェル スクリプト内のさまざまなファイルに STDIN、STDERR、STDOUT などのファイル記述子をリダイレクトできます。コマンドまたは引数を指定しない場合は、リダイレクト シンボルとファイル記述子を指定してこれらの機能を実行できます。

script.shログファイルを作成したいシェルスクリプトがある場合script.log、次のように使用できますexec

LOG=/path/to/script.log
exec 1>>$LOG
exec 2>&1

これは次の式と同等である。

./script &>> /path/to/script.log
./script >>  /path/to/script.log 2>&1

3. execコマンドを使用してプロセスのステージを作成する

exec コマンドを使用して、プロセスの段階のように順番に実行されるシェル スクリプトのセットを作成することもできます。制御を次のスクリプトに渡す必要があるたびに新しいプロセスを生成する代わりに、exec コマンドを実行します。

この場合、各ステージの最後のステートメントは、exec次のステージを呼び出すコマンドである必要があります。

見るexecシェルスクリプトでのコマンドの使用多くのための。

注記:上記の一部は以下から引用これ。

答え2

ラッパースクリプト

exec主にラッパースクリプトで使用されます。

メイン プログラムを実行する前にプログラムの環境を変更したい場合、スクリプトを記述し、そのスクリプトの最後にメイン プログラムを起動することがよくあります。ただし、その時点でスクリプトをメモリ内に保持する必要はありません。そのため、execこのような場合には が使用され、メイン プログラムがマザー スクリプトを置き換えることができます。

実際の例を示します。このmate-terminal.wrapperスクリプトは mate-terminal に付属しています。mate-terminalユーザーの環境をチェックして、いくつかの追加引数を付けて起動します。

#!/usr/bin/perl -w

my $login=0;

while ($opt = shift(@ARGV))
{
    if ($opt eq '-display')
    {
        $ENV{'DISPLAY'} = shift(@ARGV);
    }
    elsif ($opt eq '-name')
    {
        $arg = shift(@ARGV);
        push(@args, "--window-with-profile=$arg");
    }
    elsif ($opt eq '-n')
    {
        # Accept but ignore
        print STDERR "$0: to set an icon, please use -name <profile> and set a profile icon\n"
    }
    elsif ($opt eq '-T' || $opt eq '-title')
    {
        push(@args, '-t', shift(@ARGV));
    }
    elsif ($opt eq '-ls')
    {
        $login = 1;
    }
    elsif ($opt eq '+ls')
    {
        $login = 0;
    }
    elsif ($opt eq '-geometry')
    {
        $arg = shift(@ARGV);
        push(@args, "--geometry=$arg");
    }
    elsif ($opt eq '-fn')
    {
        $arg = shift(@ARGV);
        push(@args, "--font=$arg");
    }
    elsif ($opt eq '-fg')
    {
        $arg = shift(@ARGV);
        push(@args, "--foreground=$arg");
    }
    elsif ($opt eq '-bg')
    {
        $arg = shift(@ARGV);
        push(@args, "--background=$arg");
    }
    elsif ($opt eq '-tn')
    {
       $arg = shift(@ARGV);
       push(@args, "--termname=$arg");
    }
    elsif ($opt eq '-e')
    {
        $arg = shift(@ARGV);
        if (@ARGV)
        {
            push(@args, '-x', $arg, @ARGV);
            last;
        }
        else
        {
            push(@args, '-e', $arg);
        }
        last;
    }
    elsif ($opt eq '-h' || $opt eq '--help')
    {
        push(@args, '--help');
    }
}
if ($login == 1)
{
    @args = ('--login', @args);
}
exec('mate-terminal',@args);

ここで注目すべき点は、execメモリ内のこのスクリプトを置き換える呼び出しがあることです。

Unix & Linux StackExchangeサイトで回答された同様の質問は次のとおりです -https://unix.stackexchange.com/q/270929/19288

ファイル記述子をリダイレクトするには

のもう 1 つの一般的な使用法は、execファイル記述子のリダイレクトです。stdin、はstdoutstderrexec を使用してファイルにリダイレクトできます。

  1. リダイレクトするとstdoutexec 1>file標準出力が現在のシェル セッションの終了時に名前が付けられたファイルになりますfile。ディスプレイに出力されるものはすべてファイル内にあります。

  2. リダイレクトstdin- をファイルにリダイレクトするためにも使用できますstdin。たとえば、スクリプト ファイル を実行する場合は、 を使用して をファイルにscript.shリダイレクトするだけです。stdinexec 0<script.sh

答え3

私の知る限り、これは bash スクリプトのファイル記述子 (たとえば、STDOUT、STDERR、STDIN) をリダイレクトするためにも使用されます。

たとえば、STDIN リダイレクトを使用してキーボードではなくファイルから読み取り、STDOUT (プログラムによっては STDERR も可) リダイレクトを使用して端末ではなくファイルに書き込むことができます。

関連情報