发现很多其他帖子也有“类似”问题,但没有一个真正接近我所遇到的问题。
树莓派 Raspian。
我的 Udev 规则:
SUBSYSTEM=="block", ACTION=="add", RUN+="/bin/bash usr/bin/cardin.sh"
cardin.sh 依次调用另一个脚本(因为这个脚本可能需要很长时间才能运行 - 因此不能由 udev 直接调用)。我将其输出到 tty1 上以显示在 Pi 屏幕上。
#!/bin/bash
echo "SD CARD DETECTED">/dev/tty1
(/bin/bash /usr/bin/empty-card.sh >/dev/tty1) &
然后,第二个脚本执行一些操作(出于专业保密原因,这里未显示某些操作),包括解析 txt 文件、查找以 UTC 时间写入的日期字符串并以当地时间显示它们。
#!/bin/bash
SD_LOC="/media/sd_card"
CARD_FOLDER="$SD_LOC/st"
DEV="/dev/sda1"
if [ -b $DEV ]; then
shopt -s nullglob ##to avoid wildcard list being non empty
mount $DEV $SD_LOC
echo "SD-Card Mounted WAIT WAIT WAIT WAIT WAIT WAIT"
DIR_CONTENTS=$(ls -A "$CARD_FOLDER")
if [ -z "$DIR_CONTENTS" ] ; then
echo "This is an Empty Card"
else
echo -e "List of Folders Found:"
for FOLDER in "$CARD_FOLDER"/* ; do
NAME="$(basename "$FOLDER")"
LOG="$FOLDER/log.txt"
if [ -r $LOG ] ; then
START=$(grep "Recording started," "$LOG" | grep -oE '[0-9]{2}-[a-Z]{3}-[0-9]{4}[[:space:]][0-9][0-9]:[0-9][0-9]:[0-9][0-9]')
STOP=$(grep "Recording stopped," "$LOG" | grep -oE '[0-9]{2}-[a-Z]{3}-[0-9]{4}[[:space:]][0-9][0-9]:[0-9][0-9]:[0-9][0-9]')
echo -e "$NAME --- Started $(date -d "$START UTC") --- Finished $(date -d "$STOP UTC")"
else
echo "$NAME --- No Log File in there"
fi
done
echo -e "\nSD-Card Copying:"
for FOLDER in "$CARD_FOLDER"/* ; do
##[lots of other stuff not relevant to the quesiton]
done
echo "SD-Card All - SD Card emptied"
fi
umount $SD_LOC
echo "SD-Card Ummounted - OK TO REMOVE OK TO REMOVE OK TO REMOVE OK TO REMOVE OK TO REMOVE OK TO REMOVE"
else
echo "SD-Card No SD Card"
fi
这两个脚本均由 root 拥有。
我的问题是,如果我手动调用第一个脚本或第二个脚本,它会产生预期的结果。我不需要 sudo 调用;如果我这样做,它无论如何都会起作用。但是当由 Udev 触发时,即插入卡时,脚本会执行所有操作(包括未显示部分中的一些 cp / mv 命令),但它不会显示日志文件中的正确日期,而是显示今天的日期 10:00。
当前调试状态:正则表达式中的空格是罪魁祸首之一。我现在使用的是 [[:space:]]。两个连字符是另外两个罪魁祸首 - 试图转义它们但没有成功。我试过 -、\- 甚至“-”和“\-”还有其他线索吗?