当前位置: 首页 > 面试题库 >

bash脚本中不存在的原子创建文件

谷梁弘深
2023-03-14
问题内容

系统调用中open(),如果使用打开O_CREAT | O_EXCL,系统调用将确保仅在文件不存在时才创建该文件。系统调用保证原子性。有没有类似的方法可以通过bash脚本以原子方式创建文件?

更新:我发现了两种不同的原子方式

  1. 使用set -o noclobber。然后,您可以原子地使用>运算符。
  2. 只需使用mkdir。Mkdir是原子的

问题答案:

100%纯bash解决方案:

set -o noclobber
{ > file ; } &> /dev/null

file如果不存在名为的文件,则此命令将创建一个名为的文件file。如果有一个名为的文件file,则什么也不做(但返回一个非零的返回码)。

优点touch

  • 如果文件已经存在,则不更新时间戳
  • 内置100%bash
  • 按预期返回代码:如果file已经存在或file无法创建,则失败;成功,如果file不存在并被创建。

缺点:

  • 需要设置该noclobber选项(但是如果您对重定向很小心,或者在之后取消设置,那么在脚本中就可以了)。

我猜这种解决方案确实是使用进行open系统调用的bash对应方式O_CREAT | O_EXCL



 类似资料:
  • 问题内容: 我正在寻找编写一个小的bash脚本,以便在启动时监视任何新创建文件的目录。如果出现新文件,我希望它的存在触发第二个脚本运行。 我看到它被用来触发压缩最近数字化的视频,并将其添加到摄取素材的日志中。 目前,我的代码如下所示: 有没有更简单/更清洁/更少内存的方式来做到这一点? 编辑 我将在每个捕获会话中更改提取目录。我已经相应地调整了代码 问题答案: Incron 怎么样?它在文件/目录

  • 我试图在shell脚本中创建一个时间戳变量,以使日志记录更加容易。我希望在脚本的开头创建变量,并让它在发出时打印出当前时间。事实证明,这比我想象的要困难得多。以下是我尝试过的一些事情: 我尝试过的其他东西只是轻微的变化,没有更好的效果。有人知道如何完成我想做的事吗?

  • 我正在使用两个版本的ROS,彼此相邻。要使用它,我必须为特定版本提供一些环境变量。我想创建一个脚本来实现这一点。但是如果我创建一个如下的脚本,变量没有设置,它们可能是在子shell中设置的。如何将文件源文件发送到主终端外壳? source.sh: 以下是我如何调用source。上海: 更新:通过采购来源。正如答案中所建议的那样,我现在可以看到正在设置的变量。

  • 问题内容: 我想从bash脚本执行python脚本,并且要将python脚本的输出存储在变量中。 在我的python脚本中,我将一些内容打印到屏幕上,最后我返回一个带有以下内容的字符串: 在我的bash脚本中,我执行了以下操作: 但是,当我检查with的值时,我得到了Python脚本打印到屏幕上的所有内容,但 没有 返回值! 我应该怎么做? 编辑:我需要该字符串,因为它告诉我Python脚本创建的

  • 问题内容: 有客观的更好的方法在bash脚本中创建临时文件吗? 我通常只要给他们起名就可以使用它们,例如tempfile-123,因为脚本结束后它将被删除。除了覆盖当前文件夹中可能的tempfile-123之外,这样做是否有其他缺点?还是以更谨慎的方式创建临时文件有什么好处? 问题答案: 该手册页解释了它相当好: 传统上,许多shell脚本使用pid作为后缀来命名程序名称,并将其用作临时文件名。这

  • 问题内容: 我正在做一个bash shell脚本,我想更改创建新文件的默认组。我知道您用来更改权限。团体有东西吗? 问题答案: 该命令用于在登录会话期间更改当前组ID。 在该会话中创建的新目录将具有该命令设置的组ID。 (1)