私は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
、はstdout
、stderr
exec を使用してファイルにリダイレクトできます。
リダイレクトすると
stdout
、exec 1>file
標準出力が現在のシェル セッションの終了時に名前が付けられたファイルになりますfile
。ディスプレイに出力されるものはすべてファイル内にあります。リダイレクト
stdin
- をファイルにリダイレクトするためにも使用できますstdin
。たとえば、スクリプト ファイル を実行する場合は、 を使用して をファイルにscript.sh
リダイレクトするだけです。stdin
exec 0<script.sh
答え3
私の知る限り、これは bash スクリプトのファイル記述子 (たとえば、STDOUT、STDERR、STDIN) をリダイレクトするためにも使用されます。
たとえば、STDIN リダイレクトを使用してキーボードではなくファイルから読み取り、STDOUT (プログラムによっては STDERR も可) リダイレクトを使用して端末ではなくファイルに書き込むことができます。