bash script stdout在运行之前创建文件

Pau*_*e13 0 bash stdout

我正在创建一些脚本.我将省略cron,文件更改日志等.

脚本中出现问题的部分如下:

#! /bin/bash ls>./directoryContents.txt

如果您运行此脚本,您将找到directoryContents.txt作为ls列出的文件之一.

为什么在运行ls命令之前创建了文件directoryContents.txt?

有一种简单的方法来解决这个问题吗?

Tom*_*ech 5

使用时command > file,shell会在运行命令之前创建,截断并打开文件.

避免列出此文件的一种简单方法是在其他地方创建它,然后将其移动到目录中:

ls > /tmp/directoryContents.txt && mv /tmp/directoryContents.txt directoryContents.txt 
Run Code Online (Sandbox Code Playgroud)

当然这只会工作一次.

更好的方法是在Bash中使用扩展的glob来匹配除文件之外的所有内容:

shopt -s extglob
printf '%s\n' !(directoryContents.txt) > directoryContents.txt
Run Code Online (Sandbox Code Playgroud)

  • @ Paultheawesome13这一系列事件是初学shell用户常见的麻烦来源.例如,如果您尝试从文件读取命令,处理它并将输出发送到同一文件,您将发现文件的内容在读取之前被删除("截断").临时文件技巧也是一种可行的解决方法. (3认同)