私は通常StackOverflowに滞在しますが、このトピックについてはあなたがもっと専門家だと思います。
だから今日の練習問題が奇妙で一つ作成し、script.sh
最善を尽くして消されないようにtest.txt
しなければならないのに問題は最後の減りです持つ~になる
rm -f test.txt
私はシェルについてよく知らないので(通常はC / Objective-Cを使用します)、本を拾い上げましたが、まだ読んでいないので、どうすればいいのかわかりません。
権限について考えましたが、スクリプトをテストするとすべての権限が付与されるため、オプションではありません...(これが重要かどうかはわかりませんが、スクリプトはOS Xで実行されます).
答え1
Linuxでは、immutableフラグを使用してchattr
ファイルシステムレベルの読み取り専用を達成できます(ただし、適切な権限が必要です)。私はOSを使用しませ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
これを変更するもう1つの方法は、$PATH
スタブrm
プログラム(検索パスとして使用)を使用することです。/tmp
#!/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 .