我可以安全地忽略:“警告:命令替换:忽略输入中的空字节”吗?

我可以安全地忽略:“警告:命令替换:忽略输入中的空字节”吗?

是否可以安全地忽略上述错误消息?或者是否可以删除空字节?我尝试删除它,tr但仍然收到相同的错误消息。

这是我的脚本:

#!/bin/bash                                                                     

monitordir="/home/user/Monitor/"                                                
tempdir="/home/user/tmp/"                                                       
logfile="/home/user/notifyme"                                                   

inotifywait -m -r -e create ${monitordir} |                                     
while read newfile; do                                                          
    echo "$(date +'%m-%d-%Y %r') ${newfile}" >> ${logfile};                     
    basefile=$(echo ${newfile} | cut -d" " -f1,3 --output-delimiter="" | tr -d '\n');
    cp -u ${basefile} ${tempdir};                                               
done

当我运行inotify-create.sh并创建一个新文件时"monitordir"

我得到:

[@bash]$ ./inotify-create.sh 
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
./inotify-create.sh: line 9: warning: command substitution: ignored null byte in input

答案1

至于你的确切问题:

我可以安全地忽略:“警告:...忽略空字节...”吗?

答案是肯定的,因为您正在使用自己的代码创建空字节。
但真正的问题是:为什么需要“空字节”?

inotifywait命令将产生以下形式的输出:

$dir ACTION $filename

对于您的输入,如下所示(对于文件 hello4):

/home/user/Monitor/ CREATE hello4

命令 cut 将打印字段 1 和 3,并且使用空分隔符 in--output-delimiter=""将生成带有嵌入空值的输出,如下所示:

$'/home/user/Monitor/\0hello4\n'

这不是您所需要的,因为添加了 null。

事实证明,解决方案非常简单。
由于您已经在使用该命令read,因此请执行以下操作:

#!/bin/bash
monitordir="/home/user/Monitor/"
tempdir="/home/user/tmp/"
logfile="/home/user/notifyme"

inotifywait -m -r -e create ${monitordir} |
    while read dir action basefile; do
        cp -u "${dir}${basefile}" "${tempdir}";
    done

使用 IFS 的默认值在空格上分割输入,然后仅使用目录和文件名进行复制。

相关内容