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

时间:2015-01-01 21:19:47

标签: bash shell scripting echo sh

我是bash的新手,并尝试编写一个禁用kworker业务的脚本,就像在aMaia的回答here中一样。

到目前为止,我有这个,我从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  

但是运行它会导致:

./kkiller: line 10: echo: write error: Invalid argument

这里发生了什么?我认为$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

4 个答案:

答案 0 :(得分:6)

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

解决方案(在Bash中):echo -n disable >/sys/firmware/acpi/interrupts/gpe66。这样就不会回应换行符。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

我认为它与权限有关。我不认为root默认情况下对这些文件具有写访问权限。尝试手动回音'禁用'对于该文件,即使是root用户,也会显示相同的错误。所以为了使你的脚本工作,首先在你的回声之前在$ i上做chmod 744,它应该可以解决问题。

答案 3 :(得分:0)

我收到相同的错误消息,试图禁用已经设置为禁用的GPE:

# echo "disable" > /sys/firmware/acpi/interrupts/gpe17
-su: echo: write error: Invalid argument
# cat /sys/firmware/acpi/interrupts/gpe17
 3718289     STS disabled     unmasked

启用它之后,我可以将其禁用而不会出现错误:

# echo "enable" > /sys/firmware/acpi/interrupts/gpe17
# echo "disable" > /sys/firmware/acpi/interrupts/gpe17
#