我有一个 crontab 作业,它在 Arch Linux 上执行 Ruby 脚本。它基本上可以工作,但是当我调用“googlecl”发布到我的博客时,它总是显示“safeDecodeError”异常(例如:googlecl.SafeDecodeError:ascii 无法解码“Vas\xc3\xa1rnap”),因为我使用的命令行包含国家匈牙利字符(éáüö 等)。我的语言环境通过命令设置为 hu_HU.UTF-8:
sudo localectl set-locale LANG="hu_HU.UTF-8"
我的 crontab 行如下所示:
05 15 * * * export LANG="hu_HU.UTF-8"; export LC_CTYPE="hu_HU.UTF-8"; /home/walaki/dl/musor-blogger
我的 Ruby 脚本如下:
#!/usr/bin/ruby
# encoding: utf-8
require 'watir-webdriver'
require 'pry'
reklam=["http://keresztenytars.net","http://premium-leechers.blogspot.hu"]
fname="/home/walaki/util/radiomusor-blogger.txt"
b = Watir::Browser.new :phantomjs
if ARGV.length==0 then
date_today=Time.now.to_s.split(" ")[0]
else
date_today=ARGV[0]
end
url="http://hangtar.radio.hu/kossuth#!#"+date_today
datepart=date_today.gsub("-","")
dow=Date.parse(date_today).strftime("%A")
case dow
when /monday/i
nap="Hétfő"
when /tuesday/i
nap="Kedd"
when /wednesday/i
nap="Szerda"
when /thursday/i
nap="Csütörtök"
when /friday/i
nap="Péntek"
when /saturday/i
nap="Szombat"
when /sunday/i
nap="Vasárnap"
end
puts url
puts nap
puts datepart
b.goto url
b.links(:text=>"Részletes műsor")[0].click
sleep 6
#html="";b.divs(:class=>"musorelem sclick").each{|d| d.click rescue nil;html+=b.html}
html=b.html
tc=html.scan(/class\=\"me_idopont.*?\<span\>(.*?)\<\/span\>.*?\<div.*?class\=\"me_cim.*?\<span\>(.*?)\<\/span\>.*?\<div.*?class\=\"me_leiras.*?\>(.*?)\<\/div\>/m).flatten
h={};for i in 0..(tc.length-1)/3; h.merge!(tc[i*3]=>[tc[i*3+1],tc[i*3+2]]);end
open(fname, 'w') { |f|
f.puts "<div class='post-body entry-content' itemprop='articleBody'>"
f.puts "<b>"+nap+"</b><br>"
h.each do |k,v|
#line="<a href=http://stream001.radio.hu:443/stream/"+datepart+"_"+k.gsub(":","")+"00_1.mp3>"+k+" "+v[0]+"</a><br><p style='margin: 0px 0px 0px 15px; text-align:justify; line-height:10px'><small>"+v[1].gsub("<br>","\n")+"</small></p>"
line="<a href=http://stream001.radio.hu:443/stream/#{datepart}_#{k.gsub(":","")}00_1.mp3>#{k}</a> <a href='#{reklam.sample(1).first}' target=_blank>#{v[0]}</a><br><p style='margin: 0px 0px 0px 15px; text-align:justify; line-height:10px'><small>#{v[1].gsub("<br>","\n")}</small></p>"
#binding.pry
#puts line
f.puts line
end
f.puts "</div>"
}
var='google blogger post --blog="My Blog" --tags="'+nap+'" --title="'+date_today+', '+nap+'" --src=/home/walaki/util/radiomusor-blogger.txt'
system var
当我使用 Ruby 的“系统”语句调用 googlecl 命令时,命令行 (var) 包含 UTF-8 字符(áéüö 等),并且 googlecl 引发异常。
当我从常用的终端窗口手动调用 Ruby 脚本时,它运行正常。但是当我使用 crontab 每天启动它时,由于这个终端字符编码问题,它总是失败。
我的问题是,在运行 cron 作业时如何设置终端字符编码?
答案1
两种可尝试的方法:
- 确保重新导出子 shell 的 LANG 和其他环境变量,以确保“google”命令也可以看到它们。
- 使用 HTML 代码(&#n;)对星期几字符串(“nap”)进行编码,因为它们无论如何都会进入网络: