Якщо я передаю рядок, що складається лише з натурального числа /sys/class/backlight/intel_backlight/brightness
, це працює. Але якщо я передаю рядок, що містить щось інше, що я спробував, я отримую повідомлення про помилку:
$ sudo su -c "echo 10 >/sys/class/backlight/intel_backlight/brightness"
$ sudo su -c "echo -- -1 >/sys/class/backlight/intel_backlight/brightness"
bash: line 0: echo: write error: Invalid argument
$ sudo su -c "echo aa >/sys/class/backlight/intel_backlight/brightness"
bash: line 0: echo: write error: Invalid argument
$ sudo su -c "echo 10.2 >/sys/class/backlight/intel_backlight/brightness"
bash: line 0: echo: write error: Invalid argument
Я спершу подумав, що це якийсь спеціальний файл, але, здається, це звичайний файл:
$ file /sys/class/backlight/intel_backlight/brightness
/sys/class/backlight/intel_backlight/brightness: ASCII text
Що відбувається?
echo
? Коли я це роблю echo aueu > /dev/sda
, я отримую bash: /dev/sda: Permission denied
, тому це не говорить про те, що він належить до echo
цього випадку (що я вважаю більш логічним на даний момент). Яку функцію здійснює перевірка в просторі користувача? Чи перевірено це знову в просторі ядра? Якщо я спробую зберегти недійсне значення за допомогою Emacs, я отримую Write error: invalid argument, /sys/[...]/brightness
, btw.
kstrtoul
у функції bl_power_store
у файлі drivers/video/backlight/backlight.c
) генерує помилку, яка є результатом системного виклику запису при виконанні echo
. Permission denied
помилки також генеруються ядром, але на рівні файлової системи вже при спробі відкрити файл, набагато раніше, і з різним кодом обробки помилок у bash
.
sysfs
; Я думаю, що повинен був бути дублікат цього питання, але я досі не знайшов його.