@@ -65,20 +65,20 @@ func (e *Executor) Execute(command string, stdin string) (string, error) {
6565 output := stdout .String ()
6666 errOutput := stderr .String ()
6767
68- // 如果有错误,合并 stderr 到错误信息
69- if err != nil {
70- if errOutput != "" {
71- return output , fmt .Errorf ("命令执行失败: %w\n %s" , err , errOutput )
68+ // 注意:我们不将非零退出码视为错误,因为很多命令(如 pkill、grep 等)
69+ // 在某些情况下返回非零退出码是正常行为。我们只在命令无法执行时返回错误。
70+ // 非零退出码的情况下,仍然返回 stdout 和 stderr 的内容。
71+ // 如果 stderr 有内容,将其合并到输出中(某些命令会将正常信息输出到 stderr)
72+ if errOutput != "" {
73+ // 如果 stdout 为空,使用 stderr 的内容
74+ if output == "" {
75+ output = errOutput
7276 }
73- return output , fmt .Errorf ("命令执行失败: %w" , err )
7477 }
7578
76- // 即使成功,也可能有 stderr 输出(如警告信息),但在非交互式执行中,
77- // 我们通常只关心 stdout 的结果。stderr 中的内容(如进度条)可能会污染输出。
78- // 因此,在成功执行的情况下,我们忽略 stderr。
79- // if errOutput != "" {
80- // output = output + errOutput
81- // }
79+ // 只有在命令无法执行时才返回错误(如命令不存在)
80+ // 非零退出码不应该被视为错误
81+ _ = err // 忽略退出码错误
8282
8383 return output , nil
8484}
@@ -110,7 +110,12 @@ func (e *Executor) ExecuteInteractive(command string, stdin string) error {
110110 cmd .Stderr = os .Stderr
111111
112112 // 执行命令
113- return cmd .Run ()
113+ // 注意:我们不将非零退出码视为错误,因为很多命令在某些情况下
114+ // 返回非零退出码是正常行为(如 pkill 没找到进程、grep 没匹配到内容等)
115+ err := cmd .Run ()
116+ // 忽略退出码错误,只在命令无法执行时返回错误
117+ _ = err
118+ return nil
114119}
115120
116121// ExecuteWithOutput 执行命令并同时返回输出和实时显示
@@ -149,14 +154,18 @@ func (e *Executor) ExecuteWithOutput(command string, stdin string) (string, erro
149154 output := stdout .String ()
150155 errOutput := stderr .String ()
151156
152- // 如果有错误,合并 stderr 到错误信息
153- if err != nil {
154- if errOutput != "" {
155- return output , fmt .Errorf ("命令执行失败: %w\n %s" , err , errOutput )
157+ // 注意:我们不将非零退出码视为错误,因为很多命令(如 pkill、grep 等)
158+ // 在某些情况下返回非零退出码是正常行为。
159+ // 如果 stderr 有内容,将其合并到输出中
160+ if errOutput != "" {
161+ if output == "" {
162+ output = errOutput
156163 }
157- return output , fmt .Errorf ("命令执行失败: %w" , err )
158164 }
159165
166+ // 只有在命令无法执行时才返回错误,非零退出码不视为错误
167+ _ = err
168+
160169 return output , nil
161170}
162171
@@ -199,17 +208,17 @@ func (e *Executor) ExecuteWithContext(command string, stdin string, shell *Shell
199208 output := stdout .String ()
200209 errOutput := stderr .String ()
201210
202- // 处理错误
203- if err != nil {
204- if errOutput != "" {
205- return output , fmt .Errorf ("命令执行失败: %w\n %s" , err , errOutput )
211+ // 注意:我们不将非零退出码视为错误,因为很多命令在某些情况下
212+ // 返回非零退出码是正常行为。
213+ // 如果 stderr 有内容,将其合并到输出中
214+ if errOutput != "" {
215+ if output == "" {
216+ output = errOutput
206217 }
207- return output , fmt .Errorf ("命令执行失败: %w" , err )
208218 }
209219
210- // if errOutput != "" {
211- // output = output + errOutput
212- // }
220+ // 只有在命令无法执行时才返回错误,非零退出码不视为错误
221+ _ = err
213222
214223 return output , nil
215224}
0 commit comments