微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Bash:创build一个文件,如果它不存在,否则检查,看它是否是可写的

我有一个bash程序将写入输出文件。 该文件可能存在也可能不存在,但脚本必须检查权限并提前失败。 我找不到一个优雅的方式来做到这一点。 这是我所尝试的。

设置+ e

触摸$文件

设置-e

如果[$? -ne 0]; 然后退出; fi

我一直为这个脚本set -e ,所以如果任何一行上有错误,它就会失败。 有没有更简单的方法来做到上面的脚本?

如何检查一个string是否至less有一个字母字符?

如何在许多文件上运行python脚本来获取许多输出文件

将目录中的所有文件复制到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] 举报,一经查实,本站将立刻删除。

相关推荐