¡Casi una solución por delante!
Según esta documentación ... es posible controlar la potencia/rpm del ventilador del procesador con los siguientes comandos...
echo 255 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1 # Full fan speed (Value: 255)
echo 0 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1 # Fan is stopped (Value: 0)
echo 2 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[[:print:]]*/pwm1_enable # Change fan mode to automatic
echo 1 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1_enable # Change fan mode to manual
Estos comandos se aplican a portátiles ASUS (mi caso ).
Visto esto, disparamos la salida HDMI (como se explica en este hilo )y en secuencia ejecutamos el comando...
echo 255 > /sys/devices/platform/asus-nb-wmi/hwmon/hwmon[[:print:]]*/pwm1 # Full fan speed (Value: 255)
... eso pone el ventilador a máxima potencia/rpm.
Resultado :¡Temperatura bajo control! ¡No se produce ningún bloqueo del sistema! =D
Ante esto, propongo una de las siguientes soluciones:
NOTA I:Hay otras formas de controlar la potencia/rpm del ventilador (y la respuesta de temperatura ). El "fancontrol", por ejemplo, es uno de ellos.
NOTA II:Hay componentes que pueden estar influyendo en la potencia/rpm del ventilador como "thermald" y "tlp". Ambos están instalados por defecto en Manjaro.
ADEMÁS:Me gustaría su opinión y sugerencias de solución para aumentar la potencia/rpm del ventilador de manera más inteligente.
Это может быть излишним, но вы можете получить это, используя read -e
, который включает средство Readline в утилите read
. В этот момент желаемый результат будет состоять только из привязки одной клавиши -.
Осторожно, однако, что Readline также содержит множество других функций, таких как завершение, история и т. д., которые вам могут не понадобиться для простого read my_variable
. Если это нежелательно, вы должны явно очистить привязки клавиш -и отключить функции, которые вам не нужны для вашего read -e
.
Пример доказательства -концепции -из командной строки -:
(bind 'TAB: accept-line'; IFS= read -re var && echo "$var" || echo ko)
Вы также можете сделать это в сценарии, хотя bind
выдаст предупреждение (, которое вы все равно можете отключить, перенаправив2>/dev/null
).
Альтернативой командам bind
в скрипте является предоставление пользовательского файла inputrc перед вызовом скрипта, на который вы хотите повлиять. Нет необходимости иметь настоящий файл, достаточно здесь документа.
Приведенный выше пример сделан с помощью скриптов:
#!/bin/bash
export INPUTRC=/dev/fd/3
script2.sh 3<<EOF
TAB: accept-line
set history-size 0
EOF
# this example 'inputrc'-like file also disables history support
Приведенный выше сценарий подготавливает пользовательский файл inputrc в качестве документа «Здесь» в файле -с дескриптором 3, который интерпретатор script2.sh
будет считывать, как указано в переменной окружения INPUTRC
.
Тогдаscript2.sh
:
#!/bin/bash
echo start
bind -q accept-line 2>/dev/null # shows which keys are configured to accept input
IFS= read -re var && echo "$var" || echo ko
echo end
Перед ожиданием ввода на read
скрипт напечатает что-то вроде:
accept-line can be invoked via "\C-i", "\C-j", "\C-m".
показывает, что Вкладка(т.е. Ctrl -I показано выше, так как\C-i
)принимает строку точно так же, как Возврат(т.е. Ctrl -M , каретка -возврат )или новая строка(Ctrl -J).
Более "реальный" пример:
#!/bin/bash
bind 'TAB: accept-line' &>/dev/null
echo "enter your name:"
IFS= read -re var
echo "your name is: $var"
Если вы пойдете по этому пути, ознакомьтесь с руководством пользователя Readline , по крайней мере, сокращенным в вашем man bash
. Параметр set convert-meta off
среди прочих заслуживает особого упоминания, чтобы обеспечить лучшую поддержку символов ascii, отличных от -.
Как правило, это можно сделать, установив termios(3)
/stty(1)
VEOL
/ eol
специальный символ («альтернативный конец -строки -» )в Tab. В системах, которые его поддерживают, также можно использовать VEOL2
/ eol2
.
К сожалению, встроенная -оболочка read
всегда будет пытаться читать до новой строки (или другого разделителя в bash
, если использовался -d
, без поддержки нескольких разделителей ).
Один из способов, который можно обойти, заключается в использовании подстановки команды var=$(dd count=1 bs=big)
вместо read
. Вот пример такого кладжа:
while :; do
t=$(stty -g)
stty eol ^I
trap : INT
var=$(dd bs=10k count=1 2>/dev/null; echo x)
stty "$t"
trap - INT
var=${var%x}
[ "$var" ] || break
var=${var%[$'\n\t']}
printf '{%s}\n' "$var"
done
t=(stty -g)
и stty "$t"
сохранят и восстановят настройки терминала.
trap : INT
и trap - INT
не позволят Control -C убить оболочку/цикл (со всеми осложнениями и специфичным для оболочки -поведением, которое это влечет за собой ), и позволят ему только убить dd
и подстановка команды.
$(...; echo x)
, за которым следует ${var%x}
, является уловкой, предотвращающей удаление завершающего символа новой строки из подстановки команды; это необходимо для того, чтобы иметь возможность различать, когда пользователь нажал только Enter
для пустой переменной, и Control-C
или Control-D
для выхода из цикла.
Наконец, ${var%[$'\n\t']}
удалит завершающую новую строку или табуляцию из переменной. В оболочках, которые не поддерживают строки $'...'
, такие как dash
или yash
, их можно заменить на :
nltab='<literal tab here>
'
...
var=${var%[$nltab]}