【问题标题】:Ambiguous redirect error in shell scripting when creating file name with date [duplicate]使用日期创建文件名时,shell脚本中的不明确重定向错误[重复]
【发布时间】:2016-08-13 20:39:39
【问题描述】:

我正在尝试在 Raspberry Pi 中实现此温度记录(尽管某些代码不起作用,因此我使用了稍微不同的解决方案):

https://www.raspberrypi.org/learning/temperature-log/worksheet/

我一直坚持将结果写入文件。我想创建一个名称包含实际日期的文件,例如temperature_log_2016_08_13.txt

运行脚本时,每次执行带有回显命令的行时,我都会收到一个不明确的重定向错误。我尝试了各种带引号、双引号、不带引号的组合。请指教。

#!/bin/bash

timestamp() {
    date +%F_%H-%M-%S
}

temperature() {
    /opt/vc/bin/vcgencmd measure_temp
}

temp=$(temperature)
temp2=${temp:5:9}

echo Temperature Log_$(date) >/home/pi/logs/temperature_log_$(date).txt

for i in {1..5}
do
    echo ${temp2} $(timestamp) >>/home/pi/logs/temperature_log_$(date).txt
    sleep 1
done

更新:通过将文件名放在引号之间,如下所示,不明确的重定向错误消失了,而是脚本生成了 5 个名称中包含日期/时间戳的文件。我只需要 1 个将所有温度都写入其中的文件。

【问题讨论】:

  • >filename>>filename 放在命令上会在该命令之前打开该文件,并在命令完成后关闭它。与只打开一次文件并在多个命令中重用该句柄相比,一遍又一遍(或在循环内)执行此操作非常低效。
  • ...例如,如果您只将exec >"/home/pi/logs/temperature_log_$(date).txt" 放在脚本的顶部一次,您将both避免名称在执行,并且避免了一遍又一遍地重新打开文件的低效率。

标签: bash shell date redirect ambiguous


【解决方案1】:

您示例中的$(date) 会生成一个带有空格的时间戳。您可以改用您的函数 ($(timestamp)),也可以引用整个目标文件名(或两者都引用):

echo bla >> "/home/pi/logs/temperature_log_$(timestamp).txt"

最好只在循环之前实际评估文件名中的时间戳,否则你每秒钟或每分钟都会得到一个新文件:

# %F: full date; same as %Y-%m-%d
logfile = "/home/pi/logs/temperature_log_$(date +%F).txt" 
echo "Temperature Log_$(date)" > "$logfile" # overwrite if started 2 times a day
for i in {1..5}
do
    temp=$(/opt/vc/bin/vcgencmd measure_temp)
    temp=${temp:5:9}
    echo "${temp} $(timestamp)" >> "$logfile"
    sleep 1
done

【讨论】:

  • 您会发现日期格式如$(date +%Y-%m-%d_%H.%M.%S) 的文件将自动从最早日期或最新日期轻松排序,从而更容易操作这些文件以进行数据提取(如果需要)。祝大家好运!
  • 谢谢,现在我不再收到不明确的重定向错误,而是脚本生成了 5 个名称中包含日期/时间戳的文件。我只需要 1 个将所有温度都写入其中的文件。
  • $(date +%F)替换$(date)
  • 通过预先计算文件名扩展了答案,从而避免了它的翻转并减少了分叉的数量。
【解决方案2】:

date 的输出包含空格。您需要双引号文件名以使空格成为其中的一部分:

echo Temperature Log_$(date) > "/home/pi/logs/temperature_log_$(date).txt"

或者使用你的函数,但是引用文件名是个好习惯。

【讨论】:

  • 谢谢,现在我不再收到不明确的重定向错误,而是脚本生成了 5 个名称中包含日期/时间戳的文件。我只需要 1 个将所有温度都写入其中的文件。
  • @Gabor:然后将日期存储在一个变量中并使用它,因此它不会随着下一秒而改变。 date=$(date) 及以后的echo ... > "/path/$date.txt"
猜你喜欢
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 2014-02-12
  • 2020-02-11
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多