Якщо я передаю рядок, що складається лише з натурального числа /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; Я думаю, що повинен був бути дублікат цього питання, але я досі не знайшов його.