我试图弄清楚这个命令在做什么:
rm OUTPUT/* >> log_${ENV} 2>&1
答案1
删除文件夹rm OUTPUT/*
中的所有文件OUTPUT
。>>
将命令的输出附加到名为log_${ENV}
.这通常只会重定向来自 stdout 的消息(不带-v
参数的 rm 不应向 stdout 写入任何内容)。
将2>&1
流 2(这是 rm 写入错误消息的 stderr)重定向到流 1 (stdout),流 1 (stdout) 被重定向到文件。
因此,此命令会删除文件并将错误写入日志文件(如果有)。
答案2
该命令与
rm OUTPUT/* 2>>log_${ENV}
如在你的另一个问题,花括号在这里不会做任何特别的事情。另请参阅我的回答ENV
。
该命令删除所有OUTPUT/*
匹配的内容。如果有任何错误,这些错误将附加到给定的输出文件中。
根据 shell 和设置的 shell 选项,该OUTPUT/*
模式除了与目录中的所有名称外OUTPUT
,还可能与隐藏文件和目录的名称匹配,也可能不匹配。
该rm
实用程序不会在其标准输出上产生任何输出(这就是为什么可以如上所述重写该命令的原因),但在删除不存在的文件或当前用户无权删除的文件时可能会出现错误,或者如果它尝试删除目录(不带-r
)。这些错误消息将附加到给定的文件中。正是使用>>
(而不是>
) 使 shell 打开输出文件以进行追加而不是重写。
在原始命令中,>>log_${ENV} 2>&1
将指示 shell 打开文件进行追加并向rm
其发送实用程序的标准输出流。然后 shell 也会通过该2>&1
位将标准错误流发送到同一位置。数字1
和2
分别表示标准输出流和标准错误流,当不使用数字时,表示标准输出流。