はじめに
Linux exec
コマンドは、新しいプロセスを作成せずにシェル コマンドを実行します。代わりに、現在開いているシェル操作を置き換えます。コマンドの使い方に応じて、exec
さまざまな動作とユース ケースがあります。
この記事では、exec
の使用方法を示します。 Linux のコマンド。

前提条件
- sudo としてのコマンドライン/ターミナルへのアクセス
- Linux ターミナル コマンドの基本的な理解 (Linux コマンド チート シートを使用)
- nano などの Linux テキスト エディタ
Linux exec コマンドの構文
exec
コマンド構文は次のとおりです:
exec [options] [command [arguments]] [redirection]
このコマンドは、引数の数によって異なる動作をします:
- 引数が存在する場合、
exec
コマンドは、現在のシェルを実行されたプログラムに置き換えます。 Bash スクリプトでは、以降のコマンドは実行されません . - コマンド引数が存在しない場合、すべてのリダイレクトは現在のシェルで行われます。
exec
エラーが発生するか、コマンドがサブシェルで実行されない限り、コマンドが元のプロセスに戻ることはありません。
Linux exec コマンド オプション
以下はすべての exec
の簡単な説明です オプション:
オプション | 説明 |
---|---|
-c | 空の環境でコマンドを実行します。 |
-l | ダッシュを渡します (- ) を 0 番目の引数として指定します。 |
-a [name] | [name] を渡します ゼロ番目の引数として。 |
読み続けて exec
がどのように機能するかを確認してください 例を通して働きます。
Linux exec コマンドの例
以下の例は、exec
の動作を示しています。 ターミナルで、および Bash スクリプトを介してコマンドを実行します。
基本的な使い方 (プロセス置換)
exec
の方法を確認するには 動作する場合は、次の手順を実行してください:
1. ターミナルを開き、実行中のプロセスを一覧表示します:
ps

出力には、現在実行中の Bash シェルと ps
が表示されます 指図。 Bash シェルには一意の PID があります。
2. 確認するには、現在のプロセス ID を確認します:
echo $$

PID は ps
からの出力と同じです コマンドで、これが現在実行中の Bash プロセスであることを示します。
3. exec
を実行します sleep コマンドを 100 秒間渡します:
exec sleep 100
sleep
コマンドは 100 秒間待機します。
4. 別のターミナル タブで、現在実行中のすべてのプロセスを一覧表示し、sleep
を grep します。 コマンド:
ps -ae | grep sleep

プロセスの PID は Bash シェルの PID と同じで、exec
を示します。 コマンドは Bash シェル プロセスを置き換えました。
100 秒が経過すると Bash セッション (端末タブ) が閉じ、プロセスが終了します。
現在のシェル セッションを置き換える
exec
を使用します 現在のシェル セッションを置き換えるコマンド:
1. 現在のシェル PID を確認します:
echo $$
2. exec
を使用 Bourne Shell に切り替えるには:
exec sh

3. 別のタブで、Bourne Shell プロセスの PID を確認します。
ps -ae | grep "\bsh\b"

注: \b
grep
で sh
の完全一致を可能にする、単語境界の一致のための Regex です。 出力で。詳細については、Grep Regex チュートリアルをご覧ください。
このコマンドは、Bash プロセスを置き換えます。 Bourne Shell を終了すると、ターミナル セッションが完全に終了します。
Bash スクリプトでの exec を使用したプログラム呼び出し
exec
の方法を確認するには Bash スクリプトで動作する場合は、次の操作を行います:
1. Nano などのテキスト エディターを開き、スクリプト ファイルを作成します。
nano [script name]
2. 次のコードを貼り付けます:
#!/bin/bash
while true
do
echo "1. Update "
echo "2. Upgrade "
echo "3. Exit"
read Input
case "$Input" in
1) exec sudo apt update ;;
2) exec sudo apt upgrade ;;
3) break
esac
done

スクリプトは次のことを行います:
- 3 行目 無限の
while
を作成します ループ。 - 5 行目から 7 行目 可能な 3 つのオプションを出力してください。
- 8 行目 ユーザーの入力を変数
$Input
に読み込みます . - 9 行目
case
を開始します ユーザーの入力をチェックするステートメント。 - 10 ~ 11 行目
apt update
を実行します またはapt upgrade
現在のシェルの代わりにコマンド。更新またはアップグレード プロセスが終了すると、ターミナル セッションが終了します。 - 12 行目
break
を使用 無限while
を終了するステートメント ループしてスクリプトを終了します。セッションは通常どおり現在のシェルに戻ります。
3. スクリプトを保存し、Nano を閉じます。
4. 現在の環境で Bash スクリプトを実行して結果を確認します。
. [script name]

source コマンドでスクリプトを実行すると、スクリプトの動作が現在の Bash シェルに適用されます。 exec
を使用 クリーンな終了のために他のプログラム内で Bash スクリプトを実行します。
Bash スクリプトのロギング
exec
コマンドは、Bash スクリプトでのエラー ログのファイル記述子の操作に使用されます。デフォルトの Linux ファイル記述子は次のとおりです:
- stdin (0) - 標準
- stdout (1) - 標準出力
- stderr (2) - 標準エラー
exec
を使用 コマンドを実行し、ファイル記述子をファイルにリダイレクトしてログを作成します。ロギングの仕組みを確認するには、以下の手順に従ってください:
1. サンプルの Bash スクリプトを作成します:
nano logging.sh
2. コードをファイルに貼り付けます:
#!/bin/bash
# Create test.log file
touch test.log
# Save test.log to log_file variable
log_file="test.log"
# Redirect stdin to $log_file
exec 1>>$log_file
# Redirect stderr to the same place as stdin
exec 2>&1
echo "This line is added to the log file"
echo "And any other lines after"
eho "This line has an error and is logged as stderr"

このスクリプトは、すべてのコマンド出力とエラーを同じファイル (test.log) にリダイレクトします。 ).
3. スクリプトを保存し、テキスト エディターを閉じます。
4. スクリプトの権限を実行可能に変更します:
chmod +x logging.sh
5. スクリプトを実行します:
./logging.sh
スクリプトはコードを出力しません。代わりに、すべての出力ログが test.log に記録されます ファイル。
6. cat コマンドを使用して、test.log を確認します。 ファイルの内容:
cat test.log

ログ ファイルには、すべての標準出力とエラー メッセージが含まれています。 exec
を使用 スクリプトをデバッグし、状況に応じて入力、出力、またはエラーをログに記録します。
クリーンな環境でスクリプトを実行
-c
exec
のオプション コマンドはクリーンな環境を作成します。実証するには、ターミナルで次の操作を行います:
1. 新しい Bash シェル セッションを開始します。
bash
2. printenv
を使用する 現在の Bash シェルですべての環境変数を出力するコマンド:
printenv

このコマンドは、現在の Bash シェル セッションのすべての環境変数を出力します。
3. exec
を使用して同じコマンドを実行します -c
で フラグ:
exec -c printenv

コマンド printenv
クリーンな環境で実行され、コンソールに変数が出力されません。 -c
を使用します クリーンな環境でスクリプトやコマンドを実行するオプション
find コマンドを使用した exec
Linux の find コマンドには exec
があります コマンドをオプションとして使用して、検出されたコンテンツに対してアクションを実行します。たとえば、以下の行は chmod
を実行します find
のコマンド コマンドの結果:
sudo find ~ -name "test.log" -exec chmod +x '{}' \;

find
コマンドは、ホーム ディレクトリを検索します (~ ) test.log の場合
結論
このチュートリアルの例に従えば、exec
の使い方がわかります。 Bash スクリプトで効果的にコマンドを実行します。
次に、Crontab を使用して再起動時にジョブを自動的に実行する方法を学びます。