我有一个bash程序将写入输出文件。 该文件可能存在也可能不存在,但脚本必须检查权限并提前失败。 我找不到一个优雅的方式来做到这一点。 这是我所尝试的。
设置+ e
触摸$文件
设置-e
如果[$? -ne 0]; 然后退出; fi
我一直为这个脚本set -e ,所以如果任何一行上有错误,它就会失败。 有没有更简单的方法来做到上面的脚本?
将目录中的所有文件复制到Linux中的本地子目录中
Bash:如何logging一个bash脚本执行期间最高的内存/ cpu消耗?
如何在使用sed的string匹配后追加带有美元符号的variables?
而不是检查$? 在不同的行上,像这样立即检查返回值:
touch file || exit
只要你的umask不限制写入位被设置,你只能依靠touch的返回值
为什么复杂的东西?
file=exists_and_writeable if [ ! -e "$file" ] ; then touch "$file" fi if [ ! -w "$file" ] ; then echo cannot write to $file exit 1 fi
或者,更简洁地说,
( [ -e "$file" ] || touch "$file" ) && [ ! -w "$file" ] && echo cannot write to $file && exit 1
为什么剧本早就失败? 通过分离可写测试和文件open(),您将引入竞争条件。 相反,为什么不尝试打开(截断/附加)文件的写入,并处理错误,如果它发生? 就像是:
$ echo foo > output.txt $ if [ $? -ne 0 ]; then die("Couldn't echo foo")
正如其他人所说,如果您想避免覆盖现有文件,“noclobber”选项可能会有用。
您可以使用-w来检查文件是否可写(在bash手册页中搜索)。
if [[ ! -w $file ]]; then exit; fi
打开文件进行写入。 在shell中,这是通过输出重定向完成的。 你可以重定向shell的标准输出,把重定向放在没有参数的内置exec 。
set -e exec >shell.out # exit if shell.out can't be opened echo "This will appear in shell.out"
确保你没有设置noclobber选项(这是交互式的有用的,但通常在脚本中不可用)。 使用>如果你想截断文件,如果它存在,而>>如果你想要追加。
如果你只想测试权限,你可以运行: >foo.out来创建文件(或者如果存在的话截断它)。
如果您只想要一些命令写入文件,请在其他描述符上打开它,然后根据需要重定向。
set -e exec 3>foo.out echo "This will appear on the standard output" echo >&3 "This will appear in foo.out" echo "This will appear both on standard output and in foo.out" | tee /dev/fd/3
( /dev/fd在任何地方都不受支持,至少在Linux,* BSD,Solaris和Cygwin上是可用的。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。