【发布时间】:2015-01-24 22:48:40
【问题描述】:
是否有一种编程方式可以找出为什么我无法在 shell 脚本中写入文件(文件存在、访问被拒绝、文件系统已满等)?
例如,在 C 中,为此使用 errno 变量:
FILE *fp = fopen("/etc/passwd", "w");
if (!fp) {
if (errno == EACCES) {
// ...
}
else if (errno == EEXISTS) {
// ...
}
}
我可以用 shell 脚本做类似的事情吗?
我的测试脚本:
#!/bin/sh
err=$(echo 'x' 2>&1 > /etc/passwd)
if [ $? -ne 0 ]; then
echo "An error occured: $err"
exit 1
fi
以非 root 用户身份运行此程序将为您提供:
An error occured: 'test.sh: line 3: /etc/passwd: Permission denied'
检查$err 的内容不是恕我直言,这是一个很好的解决方案;错误消息将来可能会发生变化,并且取决于用户的locale 设置。
我也知道我可以在创建文件之前或在退出代码非零之后进行stat 和其他一些检查;但是如果您想检查所有可能的错误,这很快就会失控。在某些情况下,它也容易受到竞争条件的影响(例如在您的 test -f 和实际写入之间创建的文件)。
我正在使用 POSIX shell,并且希望以符合 POSIX 的方式进行,但也可以使用 bash 或 zsh 扩展名。
【问题讨论】:
-
$?是退出/错误代码。除了您正在捕获的实际字符串输出之外,这就是您将获得的所有内容。