Сценарий оболочки при «чтении» принимается с помощью клавиши ввода и клавиши табуляции

¡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:

  • Ponga el ventilador a máxima potencia/rpm cuando encienda el HDMI;
  • Hacer que la respuesta de temperatura del ventilador sea más "agresiva"(preferido).

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.

1
20.07.2019, 00:29
2 ответа

Это может быть излишним, но вы можете получить это, используя 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, отличных от -.

2
27.01.2020, 23:22

Как правило, это можно сделать, установив 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]}
1
27.01.2020, 23:22

Теги

Похожие вопросы