bash IFS 因终端和 cron 执行而异
bash IFS different by terminal and cron execution
我有一个文件 sortedurls.txt,它是逐行搜索域到 URL 的结果。 sortedurls.txt 看起来像这样
https://example.com/page1.php
https://example.com/page2.php
https://example.com/page-more.php
逐行循环 sortedurls.txt(url by url)并使用 wget 和 hxselect 从页面收集 img 标签。仅用于验证保存到文件 testtagstring.txt。这看起来像这样
<img alt="…" src="/assets/…/image1.jpg">§<img alt="…" src="/assets/…/image11.jpg">
<img alt="…" src="/assets/…/image2.jpg">§
等等
将分隔符 § 处的每一行拆分为数组 'tags'。
统计数组元素并将结果附加到文件中以供验证。
问题:在终端中执行工作正常,输出显示正确数量的条目(6、1、1、9 …)。从 cronjob 执行,IFS 将数量加倍到 12, 2, 2, 18 ....
知道为什么仅仅通过使用 via cron 就改变了它的行为吗?
#!/bin/bash
# Set this script dir path
scriptdirpath=/usr/local/www/apache24/data/mydomain.com/testdir
# Some config variables
useragent=googlebot
searchtag=img
delimiter=§
# Change to pwd
cd $scriptdirpath
# Make files
echo > testtagstring.txt
echo > testimages.txt
# Loop through the sortedurls.txt
while read p; do
tagString=$(wget -qO - --user-agent="$useragent" $p | hxnormalize -x | hxselect -s "$delimiter" $searchtag )
echo $tagString >> testtagstring.txt
IFS="$delimiter" read -r -a tags <<<"$tagString"
echo "Amount of img tags: ${#tags[@]}" >> $scriptdirpath/testimages.txt
done < $scriptdirpath/sortedurls.txt
我的脚本是 UTF-8 格式的,因此它们对于配置为使用 ASCII 的 cron 并不是真正有效。在我的 bash 脚本中添加以下内容即可解决问题,而无需更改 cron 配置。
LC_ALL_SAVED="$LC_ALL"
export LC_ALL=de_DE.UTF-8
CLI 和 cron 现在一切正常 运行。感谢您的帮助。
我有一个文件 sortedurls.txt,它是逐行搜索域到 URL 的结果。 sortedurls.txt 看起来像这样
https://example.com/page1.php
https://example.com/page2.php
https://example.com/page-more.php
逐行循环 sortedurls.txt(url by url)并使用 wget 和 hxselect 从页面收集 img 标签。仅用于验证保存到文件 testtagstring.txt。这看起来像这样
<img alt="…" src="/assets/…/image1.jpg">§<img alt="…" src="/assets/…/image11.jpg">
<img alt="…" src="/assets/…/image2.jpg">§
等等
将分隔符 § 处的每一行拆分为数组 'tags'。 统计数组元素并将结果附加到文件中以供验证。
问题:在终端中执行工作正常,输出显示正确数量的条目(6、1、1、9 …)。从 cronjob 执行,IFS 将数量加倍到 12, 2, 2, 18 ....
知道为什么仅仅通过使用 via cron 就改变了它的行为吗?
#!/bin/bash
# Set this script dir path
scriptdirpath=/usr/local/www/apache24/data/mydomain.com/testdir
# Some config variables
useragent=googlebot
searchtag=img
delimiter=§
# Change to pwd
cd $scriptdirpath
# Make files
echo > testtagstring.txt
echo > testimages.txt
# Loop through the sortedurls.txt
while read p; do
tagString=$(wget -qO - --user-agent="$useragent" $p | hxnormalize -x | hxselect -s "$delimiter" $searchtag )
echo $tagString >> testtagstring.txt
IFS="$delimiter" read -r -a tags <<<"$tagString"
echo "Amount of img tags: ${#tags[@]}" >> $scriptdirpath/testimages.txt
done < $scriptdirpath/sortedurls.txt
我的脚本是 UTF-8 格式的,因此它们对于配置为使用 ASCII 的 cron 并不是真正有效。在我的 bash 脚本中添加以下内容即可解决问题,而无需更改 cron 配置。
LC_ALL_SAVED="$LC_ALL"
export LC_ALL=de_DE.UTF-8
CLI 和 cron 现在一切正常 运行。感谢您的帮助。