rm -f 後でもファイルが削除されないようにする

rm -f 後でもファイルが削除されないようにする

私はいつも StackOverflow を利用しています。しかし、このトピックに関しては皆さんの方がはるかに専門家だと思います。

今日の練習は変なものです。私は文章を書いて、削除されないscript.shようにできる限りのことをしなければなりませんtest.txtが、問題は最後の行がもっているすることが

rm -f test.txt

私はシェルについてあまり詳しくないので (通常は c/objective-c を使用します)、本を 1 冊購入しましたが、まだ読み終えていません。それでも、シェルのやり方がまったくわかりません。

権限について考えましたが、テスト時にスクリプトにすべての権限が付与されるため、オプションではありません... (重要かどうかはわかりませんが、スクリプトは OS X で実行されます)。

答え1

Linux では、不変フラグを使用して、chattrファイルシステム レベルで読み取り専用を実現できます (ただし、適切な権限が必要です)。私は OS X を使用していないので、同様のものがあるかどうかはわかりませんが、次のようにして「スクリプトが実行された後もtest.txt存在する」状態を実現できます。

#!/bin/sh
mv test.txt test.bak
trap "mv test.bak test.txt" EXIT

rm -f test.txt

このスクリプトはtest.txtに名前を変更しtest.bak、スクリプトが終了したら ( の後rm -f test.txt) に名前を戻します。これは完全に読み取り専用ではありませんが、kill -KILLスクリプトを しない限り、少なくともデータは保持されるはずです。

別のアイデアとして、その行をどうしても含めるのであれば、もっと早く終了したらどうでしょうか?

#!/bin/sh
# do your thing
exit
# my boss insisted to have the 'rm' line below.

rm -f test.txt

rm何もしない関数になる代替案:

#!/bin/sh
# do your thing
rm() {
    # this function does absolutely nothing
    : # ... but it has to contain something
}

rm -f test.txt

上記の関数メソッドと似ていますが、非推奨のaliasコマンドを使用して、何もしない組み込みrmのエイリアスをtrue作成します (ただし、実際の終了コードを返します)。

#!/bin/sh
# do your thing
alias rm=true

rm -f test.txt

環境から削除する代替案(組み込みrmがないと仮定):rm

#!/bin/sh
# do your thing
PATH= # now all programs are gone, mwuahaha

# gives error: bash: rm: No such file or directory
rm -f test.txt

$PATHスタブrmプログラム (/tmp検索パスとして使用)を使用することで変更されるもう 1 つのもの:

#!/bin/sh
# do your thing
>/tmp/rm # create an empty "rm" file
chmod +x /tmp/rm
PATH=/tmp

rm -f test.txt

組み込みの詳細については、help <built-in>詳細を参照してください。例:

true: true
    Return a successful result.

    Exit Status:
    Always succeeds.

その他のコマンドについては、 を使用するman rmか、マニュアル ページを参照してくださいman bash

答え2

ファイルを削除するには、そのファイルを含むディレクトリに対する書き込み権限が必要です。

$ chmod -w .
$ rm -f test.txt
rm: cannot remove `test.txt': Permission denied

おそらく、この目的のために作成された一時ディレクトリでこれを行う必要があります。たとえば、ホームディレクトリの書き込み権限を削除したくないでしょうが、次のように簡単に回復できます。chmod +w .

関連情報