
私はいつも 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 .