Linux 環境において、ファイル操作コマンドである cp、rm、mv を実行した際、既存ファイルの上書きや削除に対して確認プロンプトが表示される場合と、されない場合が存在します。この挙動の違いは、コマンド自体の仕様ではなく、シェル上に定義されたエイリアス設定に起因しています。
ユーザー権限によるエイリアスの違い
多くの Linux ディストリビューションでは、セキュリティ保護の観点から root ユーザーに対して、危険な操作を伴うコマンドに -i (interactive)オプションを付与するエイリアスがデフォルトで設定されています。一方、一般ユーザーアカウントではこの設定が適用されていないことが多いです。
シェル上で alias コマンドを実行することで、現在のエイリアス設定を確認できます。root 権限で起動したシェルでは、以下のような定義が見つかる場合があります。
[root@server ~]# alias
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'
...
これに対し、一般ユーザーの環境ではこれらのエイリアスが定義されていないため、オプションなしでコマンドが実行され、確認メッセージなしで処理が進行します。
スクリプト実行時のプロンプト抑制
自動化スクリプト内で root ユーザーとしてこれらのコマンドを実行する場合、対話プロンプトにより処理が停止してしまうリスクがあります。これを回避するには、スクリプト内で該当するエイリアスを解除する必要があります。
以下のコマンドを使用することで、現在のシェルセッションにおけるエイリアスを削除できます。
unalias cp
unalias mv
unalias rm
なお、エイリアスおよび unalias による設定変更は、それが実行されたシェルプロセスのローカルな環境にのみ適用されます。親プロセスから子プロセスへは継承されず、逆に子プロセスでの変更が親プロセスに影響を与えることもありません。
シェルプロセス間での挙動検証
エイリアスのスコープ特性を確認するため、親シェルと子シェルをまたぐ検証を行います。ここでは、ファイル src_data.bin を dst_data.bin へコピーする操作を例にします。
[root@server test]# cp src_data.bin dst_data.bin
cp: overwrite 'dst_data.bin'? y
# 親シェルではエイリアスが有効なため確認が発生
[root@server test]# bash
# 子シェル(プロセス 2)を起動
[root@server test]# cp src_data.bin dst_data.bin
cp: overwrite 'dst_data.bin'? y
# 子シェルも親の環境を引き継ぐため確認が発生
[root@server test]# unalias cp
# 子シェル内でエイリアスを解除
[root@server test]# cp src_data.bin dst_data.bin
# 現在のシェルではエイリアスがないため確認なしで実行
[root@server test]# bash
# さらにネストした子シェル(プロセス 3)を起動
[root@server test]# cp src_data.bin dst_data.bin
cp: overwrite 'dst_data.bin'? y
# 親(プロセス 2)で unalias しても、新しい子シェルには影響しない
[root@server test]# exit
exit
[root@server test]# cp src_data.bin dst_data.bin
# プロセス 2 に戻る。ここでは unalias が有効なまま
[root@server test]# exit
exit
[root@server test]# cp src_data.bin dst_data.bin
cp: overwrite 'dst_data.bin'? y
# 最初の親シェル(プロセス 1)に戻る。エイリアスは復活している
この検証結果から、エイリアスの変更は現在のシェルセッションに限定され、新しいサブシェルを起動すると再度親環境の設定が読み込まれることがわかります。スクリプト内で確実にプロンプトを無効化するには、unalias を実行するか、エイリアスを無視してコマンドを実行するためにコマンド前にバックスラッシュ(\cp)を付与するなどの対策が必要です。