Bash

我可以安全地忽略:“警告:命令替換:輸入中忽略的空字節”嗎?

  • December 28, 2016

是否可以安全地忽略上述錯誤消息?或者是否可以刪除空字節?我嘗試將其刪除,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

至於你的確切問題:

我可以安全地忽略:“警告:……忽略空字節……”嗎?

答案是肯定的,因為您正在使用自己的程式碼創建空字節。

但真正的問題是:為什麼需要“空字節”?

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 的預設值在空白處拆分輸入,並僅使用目錄和文件名進行複制。

引用自:https://unix.stackexchange.com/questions/333334