我通常留在 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 .