2014-10-20 44 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