Предотвращение активного ожидания в ударе, без команды сна

Я боюсь, что список классов символов трудно кодируется в библиотеке C (например, в GNU libc, в build_charclass функция в posix/regcomp.c). Единственный способ расширить его состоял бы в том, чтобы перекомпилировать библиотеку C.

Можно настроить содержание каждого существующего класса в определении локали.

В большинстве случаев это должно быть достаточно хорошо для создания regexp как строки:

myclass='a*[:alnum:][:space:]'
regexp="[$myclass]"

Вы не можете вычесть символы из категории этот путь. И заботьтесь при добавлении ] или - или \ уважать синтаксис классов символов в regexes Вашего языка.

19
17.03.2013, 20:25
6 ответов

В более новых версиях bash (по крайней мере, v2), builtins может быть загружен (через enable -f filename commandname) во времени выполнения. Много таких загружаемых builtins также распределяются с источниками удара, и sleep среди них. Доступность может отличаться от ОС до ОС (и даже машина к машине), конечно. Например, на openSUSE, эти builtins распределяются через пакет bash-loadables.

Править: зафиксируйте имя пакета, добавьте минимальную версию удара.

17
27.01.2020, 19:45
  • 1
    Ничего себе, это - то, что я ищу, и я определенно узнаю что-то о встроенном загружаемом: +1. Я попробую это, и все же это - лучший ответ. –  jfg956 18.03.2013, 11:28
  • 2
    , Это работает! На debian пакет является ударом-builtins. Это только включает источники, и Make-файл должен быть отредактирован, но я смог установить sleep как встроенное.Спасибо. –  jfg956 18.03.2013, 14:46

Создание большого количества подпроцессов является плохой вещью во внутреннем цикле. Создание того sleep процесс в секунду в порядке. Нет ничего неправильно с

while ! test_condition; do
  sleep 1
done

Если Вы действительно хотите избежать внешнего процесса, Вы не должны сохранять FIFO открытым.

my_tmpdir=$(mktemp -d)
trap 'rm -rf "$my_tmpdir"' 0
mkfifo "$my_tmpdir/f"

while ! test_condition; do
  read -t 1 <>"$my_tmpdir/f"
done
8
27.01.2020, 19:45
  • 1
    Вы правы относительно процесса, в секунду являющегося арахисом (но мой вопрос был о нахождении способа удалить его). О более короткой версии Это более хорошо, чем мой, таким образом, +1 (но я удалил mkdir поскольку это сделано mktemp (в противном случае это - состояние состязания)). Также верный о while ! test_condition; который более хорош, чем мое начальное решение. –  jfg956 18.03.2013, 11:25

В ksh93 или mksh, sleep встроенная оболочка, таким образом, альтернатива могла бы быть должна использовать те оболочки вместо bash.

zsh также имеет a zselect встроенный (загруженный zmodload zsh/zselect) это может спать для данного числа сотых частей секунд с zselect -t <n>.

3
27.01.2020, 19:45

Вам действительно нужен FIFO? Перенаправление stdin к другому дескриптору файла должно работать также.

{
echo line | while read line; do
   read -t 1 <&3
   echo "$line"
done
} 3<&- 3<&0

Вдохновленный: Считайте вход в ударе внутри некоторое время цикл

0
27.01.2020, 19:45
  • 1
    Это не делает сна, это все еще использует stdin от терминала. –  jfg956 25.03.2013, 12:27

Как сказал пользователь yoi , если в вашем скрипте открыт stdin , то вместо sleep 1 вы можно просто использовать:

read -t 1 3<&- 3<&0 <&3

В Bash версии 4.1 и новее вы можете использовать число с плавающей запятой, например read -t 0.3 ...

Если в скрипте stdin закрыт (скрипт называется my_script.sh ), то вам нужно использовать другой открытый дескриптор, который не производит вывод при выполнении read , например. stdout :

read -t 1 <&1 3<&- 3<&0 <&3

Если в скрипте весь дескриптор закрыт ( stdin , stdout , stderr ) (например, потому что вызывается как демон), то вам нужно найти любой существующий файл, который не производит вывод:

read -t 1 </dev/tty10 3<&- 3<&0 <&3
2
27.01.2020, 19:45

Небольшое улучшение вышеупомянутых решений (, которое я основал на ).

bash_sleep() {
    read -rt "${1?Specify sleep interval in seconds}" -u 1 <<<"" || :;
}

# sleep for 10 seconds
bash_sleep 10

Уменьшена потребность в fifo и, следовательно, в очистке.

0
27.01.2020, 19:45

Теги

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