
我通常留在 StackOverflow,但我認為在這個主題上你們是比較專家。
所以今天的練習很奇怪,我必須寫一個script.sh
並在其中盡我所能防止test.txt
被刪除,但問題是最後一行有成為
rm -f test.txt
我對 shell 不太了解(我通常使用 c/objective-c),所以我拿起一本書,還沒讀完,但仍然不知道如何做到這一點。
我考慮過權限,但測試時腳本將被授予所有權限,因此它不是一個選項...(我不知道這是否重要,但腳本將在 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
搜尋路徑)進行更改:
#!/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 .