web-dev-qa-db-ja.com

bash-echo:書き込みエラー:無効な引数

私はbashを初めて使用し、aMaiaの回答のようにkworkerビジネスを無効にするスクリプトを作成しようとしています ここ

これまでのところ、これはルートから実行しています。

  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
5
nicole

パーミッションと関係があると思います。 rootがデフォルトでこれらのファイルへの書き込みアクセス権を持っているとは思いません。 rootとして同じエラーが表示されたとしても、そのファイルに手動で「無効」にエコーしてみてください。したがって、スクリプトを機能させるには、エコーの前に$ iでchmod744を実行します。これでうまくいくはずです。

0
MajorT

AlpineLinux環境のDockerでもこの問題が発生しました。問題は、echoがデフォルトで文字列の最後に改行文字を置き、カーネルがそれを受け入れないことだと思いますが、すべてのシステムに当てはまるわけではありません。 Dockerでこのエラーが発生しましたが、エラーメッセージにもかかわらず値が書き込まれました。

解決策(Bash):echo -n disable >/sys/firmware/acpi/interrupts/gpe66。このように、改行はエコーされません。

8
Adam Wallner

すべてのスペルを再確認してください。 echo "disabled"は、rootに対しても書き込みエラーを発行しますが、echo "disable"は成功します。

3
Chris Dunder

すでに無効に設定されている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
# 
0
Peter Nowee