在 /sys/ 中切换值的简单而优雅的方法

在 /sys/ 中切换值的简单而优雅的方法

我真正想要的是一个 NOT 并写。我的文件要么是1要么0,例如

/sys/class/leds/platform::mute/brightness
/sys/class/leds/platform::micmute/brightness

我想要的是一种将 1 变为 0 并将结果刷新到文件中的方法。如果模块作者实现了它,类似的事情toggle就会发生。

最优雅、最高尔夫的方式是什么无需调用自定义脚本

答案1

通用函数可以是:

toggle () { <"$1" tr 01 10 >"$1"; }
# or
toggle () { <"$1" tr 01 10 | tee "$1"; }
# or
toggle () { <"$1" tr 01 10 | sudo tee "$1"; }
# or
toggle () { <"$1" tr 01 10 | sudo tee "$1" >/dev/null; }

(取决于您是否想查看新值;以及是否需要使用sudo)。你像这样使用它:

toggle /sys/class/leds/platform::mute/brightness

不要将其用于可以有效截断的文件。但它确实/sys/有效。


本节更详细。它专注于/sys/class/leds/*/brightness.我们可以从以下开始:

(cd /sys/class/leds/platform::mute && <brightness tr 01 10 >brightness)

笔记:

  • 不适用于可以有效截断的文件
  • 如果你需要的sudosudo sh -c 'cd /sys/… && <brightness tr 01 10 >brightness'或者tee,如上。 shell 函数可能会很方便:

    toggLED () { sudo sh -c 'cd "/sys/class/leds/$1" && <brightness tr 01 10 >brightness' sh "$1"; }
    toggLED platform::mute
    

    或者这个支持通配符(和代码注入)的快速而肮脏的版本:

    toggLED () { sudo sh -c "cd /sys/class/leds/$1 && <brightness tr 01 10 >brightness"; }
    toggLED 'pla*:mute'
    toggLED 'foo; date'   # code injection possible
    
  • 在实践中,您可以chown和/或chmod文件brightness每次重新启动后),无需sudo再次输入密码:

    sudo chmod a+w /sys/class/leds/*/brightness
    toggLED () ( cd "/sys/class/leds/$1" && <brightness tr 01 10 >brightness )
    toggLED platform::mute
    

    另一种选择是NOPASSWDsudoers.

  • 我有在dell::kbd_backlight哪里。覆盖它的一种通用简单方法是使用(可以进一步概括为等)。完全循环的具体方法是。完全循环的一般方式需要读取和调整变换;并不是真正的高尔夫和优雅。max_brightness2tr 012 100tr 0123 1000tr 012 120max_brightness

相关内容