我真正想要的是一个 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)
笔记:
- 这不适用于可以有效截断的文件。
如果你需要的
sudo
话sudo 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
另一种选择是
NOPASSWD
在sudoers
.我有在
dell::kbd_backlight
哪里。覆盖它的一种通用简单方法是使用(可以进一步概括为等)。完全循环的具体方法是。完全循环的一般方式需要读取和调整变换;并不是真正的高尔夫和优雅。max_brightness
2
tr 012 100
tr 0123 1000
tr 012 120
max_brightness