【发布时间】:2015-06-04 01:53:38
【问题描述】:
仍在学习,我迷失了 IFS=
#!/bin/bash
inotifywait -m -r --excludei '(.txt$|.old$|.swp$|.swx$|.swpx$|.zip$)' /path/to/watch -e create |
while read path action file; do
cd $path
USER="$(stat -c %U $file)"
echo "To: User <user@domain.com>
CC: Support <user@domain.com>
From: $USER <user@domain.com>
Subject: $USER has Uploaded a new File
The user '$USER' uploaded the file '$file' to '$path'" > /mnt/remote/ian/temp2.txt
cat /path/to/temp/file.txt | ssmtp list@domain.com
rm /path/to/temp/file.txt
done
这是我的第一个脚本,只要上传的文件名中没有空格,它就可以很好地工作。我已经阅读了一些使用 IFS= 'whatever' 来定义字段分隔符的脚本,但我不想在生产时搞乱它;它可以工作,但是当我无法获取上传文件的用户的用户名时,这让我很恼火。请给我一个提示。
【问题讨论】:
-
由于 inotifywait 的格式字符串不支持
\0- 文件名中唯一不能合法存在的字符 - 实际上 isn't 是 100% - 可靠的解决方案。 -
@CharlesDuffy 这就是我害怕的...
-
顺便说一句,注意我是如何在
"$file"或"$path"的任何扩展周围使用双引号的?这对于避免错误至关重要; shellcheck.net 会指出你跳过的任何地方。 -
顺便说一句,您确定要
create(在创建文件时进行标记,但不一定在向其写入内容完成时),而不是@ 987654328@?
标签: bash variables while-loop inotify ifs