💡

【Linux】viで編集できるファイルが、何故sedで編集(置き換え)できないのか

2023/11/25に公開

0. はじめに

先日、viで編集できるファイルがsedで編集(置き換え)できず、エラーが発生することがありました。
なぜ、このような事象が発生したのか、整理してみます。
答えだけ知りたい方は、最後の 3.sedコマンドで置き換え操作ができない理由 をお読みください。

1. 状況

・/etc/oratabファイルに対してsedコマンドを実行したらエラーが発生。

[oracle@test dbs]$ sed -i 's/orcl01/orcl99/g' /etc/oratab
sed: 一時ファイル /etc/sedN33XbA を開くことができませんでした: 許可がありません

エラーの内容は、「一時ファイル /etc/sedN33XbA を開くことができませんでした: 許可がありません」となっています。私は「一時ファイルってなんだ...?」となりました。

・viコマンドを用いて直接編集する分には何もエラーが発生しません。

2. 分析

2-1. /etcディレクトリの権限を確認

[oracle@test dbs]$ ls -ld /etc
drwxr-xr-x. 144 root root 8192 11月 20 15:49 /etc

/etcディレクトリは、rootが所有者ですね。
ここで注目すべきは、その他のユーザーに対しては書き込み権限(w)が与えられていないことです。ディレクトリの書き込み権限が与えられていないユーザーは、ファイルの作成と削除が出来ません(ここ重要)

<権限について詳しくない方向けの補足>

・所有権の種類

d r w x r - x r - x
ディレクトリの意 所有者(今回はroot) グループ(今回はroot) その他のユーザー

・実行権の種類

r w x
読み取り権限 書き込み権限 実行権限

2-2. /etc/oratabファイルについての権限を確認

[oracle@test dbs]$ ls -l /etc/oratab
-rw-rw-r-- 1 oracle oinstall 781 11月 24 15:36 /etc/oratab

/etc/oratabファイルはoracleユーザーが所有しており、書き込み権限が与えられています。

3. sedコマンドで置き換え操作ができなかった理由

今回実行した、sed -i 's/orcl01/orcl99/g' /etc/oratabには、標準出力を無くす目的でiオプションを付けています。
しかし、iオプションが使用されている場合、sedは一時ファイルを作成し、その一時ファイルに対して編集を行い、最終的に、元のファイルを上書きして変更を確定するそうです。

ポイントは一時ファイルを作成する点です。ここで思い出してほしいのは、今回、その他のユーザー(Oracleユーザー)には/etcディレクトリにおける書き込み権限が無く、ファイルの作成と削除が出来ません。そのため、「sed: 一時ファイル /etc/sedN33XbA を開くことができませんでした: 許可がありません」というエラーが発生したのです。

おまけとして、iオプションの有無による違いを整理します。

  • iオプションが使用されている場合:

    • sedは一時ファイルを作成し、その一時ファイルに対して編集を行います。
    • 最終的に、元のファイルを上書きして変更を確定します。
  • iオプションが使用されていない場合:

    • sedは一時ファイルを作成しません。代わりに標準出力に結果を表示します。
    • ユーザーは必要に応じて、リダイレクトや別の手段を使って結果をファイルに書き込むことができます。

Discussion