bash - echo:写错误:参数无效

nic*_*ole 5 bash shell scripting sh echo

我是新来bash和尝试写禁用kworker业务在aMaia的回答脚本这里.

到目前为止,我有这个,我从root运行:

  1 #!/bin/bash                                                                      
  2                                                                                  
  3 cd /sys/firmware/acpi/interrupts                                                 
  4 for i in gpe[[:digit:]]* # Don't mess with gpe_all                               
  5 do                                                                               
  6     num=`awk '{print $1}' $i`                                                    
  7     if (( $num >= 1000 )); then  # potential CPU hogs?                           
  8         # Back it up and then disable it!!                                       
  9         cp $i /root/${i}.backup                                                  
 10         echo "disable" > $i                                                      
 11     fi                                                                           
 12 done  
Run Code Online (Sandbox Code Playgroud)

但运行它会导致:

./kkiller: line 10: echo: write error: Invalid argument
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?我以为$i只是文件名,这似乎是echo的正确语法.

一般来说,清理/改进脚本的建议也很受欢迎!

更新:set -vx添加到脚本的顶部,这是一个有问题的迭代:

+ for i in 'gpe[[:digit:]]*'
awk '{print $1}' $i
++ awk '{print $1}' gpe66
+ num=1024908
+ ((  1024908 >= 1000  ))
+ cp gpe66 /root/gpe66.backup
+ echo disable
./kkiller: line 10: echo: write error: Invalid argument
Run Code Online (Sandbox Code Playgroud)

Ada*_*ner 7

我在Alpine Linux环境中的Docker中也遇到了这个问题.我认为问题是默认情况下echo在字符串的末尾添加换行符,而内核不接受它,但在每个系统中都不是这样.在Docker中我遇到了这个错误,但是尽管出现了错误消息,仍然写入了该值.

将该溶液(在击): echo -n disable >/sys/firmware/acpi/interrupts/gpe66.这样就不会回应换行符.


小智 5

仔细检查所有拼写。echo "disabled" 即使对于 root 也会发出写入错误,而 echo "disable" 则会成功。


小智 0

我认为这与权限有关。我认为默认情况下 root 没有对这些文件的写入权限。尝试手动回显“禁用”该文件,即使作为 root 也会显示相同的错误。因此,为了使你的脚本正常工作,首先在 echo 之前对 $i 执行 chmod 744 ,它应该可以解决问题。