Прерываемый и непрерывный сон

Я использую вариант хака magic alias от bash:

asis() { bc <<< "$(history 1 | perl -pe 's/^ *[0-9]+ +[^ ]+ //')"; }
alias c='asis #'

Тогда:

$ c 1+1
2
$ c -10 + 20 / 5
-6
$ c (-10 + 20) / 5
2
$ c 2^8 / 13
19
$ c scale=5; 2^8 / 13
19.69230

Волшебство заключается в том, что расширение псевдонима происходит до обычной обработки командной строки, что позволяет нам создать команду, оставшиеся аргументы которой следуют за символом комментария, который реализующая функция находит с помощью команды history.

Эта магия позволяет мне вводить *, (и другие символы буквально.Но это также означает, что я не могу использовать переменные оболочки, потому что $также литерал:

$ x=5.0
$ y=-1.2
$ z=4.7
$ c ($x + $y) > $z
(standard_in) 1: illegal character: $
(standard_in) 1: illegal character: $
(standard_in) 1: illegal character: $

Я обхожу это с помощью начальной загрузки:

$ echo "x=$x; y=$y; z=$z"
x=5.0; y=-1.2; z=4.7
$ c x=5.0; y=-1.2; z=4.7; (x + y) > z
0

Лучше наберите:bcEnter 1 + 1 EnterControl+D


В качестве примечания: у меня есть настройки по умолчанию bc(, такие какscale$HOME/.bc, и я использую bc -lв псевдониме. Для вашего использования эти модификации могут не потребоваться.

0
26.02.2020, 09:08
1 ответ

Разница между прерывистым и непрерываемым сном заключается в том, что последний игнорирует сигналы:

Linux has two fundamental ways in which a process can be put to sleep. A process which is placed in the TASK_INTERRUPTIBLE state will sleep until either (1) something explicitly wakes it up, or (2) a non-masked signal is received. The TASK_UNINTERRUPTIBLE state, instead, ignores signals; processes in that state will require an explicit wakeup before they can run again.

Источник.

2
28.04.2021, 23:22

Теги

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