Своевременное увеличение переменной в скрипте bash

Да, это возможно.

Теоретически вы можете связать двоичный файл mplayer с каталогом bin, что сделает его доступным из вашей учетной записи пользователя.

Шаги:

  1. Загрузите zip-файл mplayer, скажем,mplayer-20170705.zip
  2. Запустите окно терминала и запустите cd $HOME, чтобы изменить каталог на $HOME.
  3. Распакуйте ZIP-файл, используя unzip mplayer-20170705.zip.
  4. Симлинк двоичного файла mplayerс $HOME/bin/с помощьюln -s $HOME/mplayer-20170705/mplayer $HOME/bin/
  5. Протестируйте mplayer с помощью mplayerна терминале. Должно открыться окно mplayer.

Примечание. :Я настоятельно рекомендую установить mpv player, который является ответвлением mplayer и регулярно обновляется. Вы можете найти его в Github.

2
17.09.2019, 10:12
3 ответа

В bashспециальная переменная $SECONDSуже увеличивается один раз в секунду, как и в ksh, откуда исходит функция.

Он инициализируется равным 0 во время запуска оболочки (или значением переменной среды $SECONDS, если она есть ), но вы также можете установить ее значение вручную.

Однако обратите внимание, что реализация bash(, в отличие от реализации ksh93, mksh или zsh, последние два имели одинаковую ошибку, но она была исправлена ​​после того, как я сообщил, что )не работает в том, что он увеличивается, когда системные часы проходят точную вторую отметку.

Таким образом, если вы установите значение 0в 12 :00 :00,1 или 12 :00 :00,9, оно изменится на 1в 12 :00 :01. (так что на 9/10 секунды позже в первом случае и на 1/10 секунды позже во втором)

Вместо этого вы можете переключиться на zsh, mksh или ksh93.

Затем вам просто нужно использовать $((SECONDS*3))для чего-то, что увеличивается на 3 каждую секунду, или $((SECONDS/3))для чего-то, что увеличивается на 1 каждые 3 секунды.

В ksh93можно было определить дисциплину getпроизвольной переменной как$((SECONDS*3)):

#! /bin/ksh93 -
var.get() {
 .sh.value=$((int(SECONDS*3)))
}
SECONDS=0

# testing:
echo "$var"; sleep 1; echo "$var"

дает:

0
3

Еще в ksh93 можно было определить typeпеременной, которая будет увеличиваться на любое произвольное число каждую секунду с чем-то вроде:

#! /bin/ksh93 -
SECONDS=0
typeset -T auto_incremented=(
  typeset -F start
  typeset -i initial=0
  typeset -i increment=1
  function get {
   .sh.value=$((_.initial + int((SECONDS - _.start) * _.increment)))
  }
  function create {
    ((_.start = SECONDS))
  }
  function set {
    _.initial=${.sh.value}
    ((_.start = SECONDS))
  }
)

# testing:
auto_incremented var
var.increment=2

echo "$var"; sleep 2; echo "$var"

var=10; echo "$var"; sleep 2; echo "$var"

Что здесь дает:

0
4
10
14

Хотя bashскопировал довольно много функций из ksh, он не скопировал дисциплины , типы или плавающую точку $SECONDS.

В bashодин из подходов, который вы можете использовать, — запустить некоторый фоновый процесс, который каждую секунду посылает сигнал на bashи установить ловушку на этот сигнал, которая обновляет переменную, например:

#! /bin/bash -
var=0 SECONDS=0; trap '((var = SECONDS * 3))' ALRM

ksh93 -c '
  t=0 SECONDS=0
  while
    sleep "$((++t - SECONDS))" && kill -s ALRM -- "$1" 2> /dev/null
  do
    : nothing
  done' ksh "$$" &

# testing:
echo "$var"; sleep 2; echo "$var"

Обратите внимание, что мы не можем просто увеличить $varв обработчике ловушек, поскольку ловушки обрабатываются только в -между не -встроенными командами, и если одна из этих команд занимает более 1 секунды, в течение которой более посылается один сигнал SIGALRM, обрабатывается только один.

Здесь мы используем встроенный скрипт ksh93для отправки сигнала каждую секунду, но вместо этого вы можете использовать zsh, perl, python..., если они доступны.

3
27.01.2020, 22:08

Ужасное решение:

#!/bin/bash
somevar=0
somefile=$(mktemp)
echo "$somevar" > "$somefile"
while true; do sleep 3; ((somevar++)); echo "$somevar" > "$somefile" ;done &

  while true; do

    sleep 1
    avar="$(cat "$somefile")"
    echo "my var has value $avar"

  done

Определенно НЕ точен по времени и НИГДЕ не близок к реальному времени -готов...

1
27.01.2020, 22:08

Ниже приведен код

 i=10
    for ((j=1;j<=count_of_sequence;j++)); do echo $i; sleep 10;i=$(($i+1)); done

выход

10
11
12
13
14
-1
27.01.2020, 22:08

Теги

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