2014-10-20 48 views
1

我試圖使用bash腳本中使用停止服務並重定向錯誤到一個文件猛砸錯誤重定向時,有沒有錯誤

service ssh stop 2> ssh.error

問題創建文件錯誤文件被創建,即使有是沒有錯誤

+0

這是正常行爲。如果文件爲空,請刪除該文件。或者乾脆忽略它。 http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – 2014-10-20 11:27:29

回答

1

外殼必須提供的文件是準備好寫,這意味着它必須打開該文件的命令(如果需要創建它)在開始命​​令之前。一種選擇是使用一個單獨的進程,該進程從命令的標準錯誤中讀取,並且只有在獲得某些輸入時才寫入該文件。

mkfifo err 
while read -r line; do 
    echo "$line" >> ssh.error 
done < err & log_pid=$! 
service ssh stop 2> err 
kill "$log_pid" 
rm err 

這比僅僅刪除空文件效率低。

2

外殼重定向不知道任何關於您正在運行的命令(它可能甚至可能不存在)。重定向(和文件創建)在之前發生命令運行。

這就是爲什麼你無法使用重定向讀取和寫入單個文件。 (即,printf 'contents\ncontents\n' > file; more file > file截斷/清空file文件)。

1

你可以用它來刪除該文件,如果它是空的

service ssh stop 2> ssh.error && [[ ! -s ssh.error ]] && rm ssh.error