Я боюсь, что список классов символов трудно кодируется в библиотеке C (например, в GNU libc, в build_charclass
функция в posix/regcomp.c
). Единственный способ расширить его состоял бы в том, чтобы перекомпилировать библиотеку C.
Можно настроить содержание каждого существующего класса в определении локали.
В большинстве случаев это должно быть достаточно хорошо для создания regexp как строки:
myclass='a*[:alnum:][:space:]'
regexp="[$myclass]"
Вы не можете вычесть символы из категории этот путь. И заботьтесь при добавлении ]
или -
или \
уважать синтаксис классов символов в regexes Вашего языка.
В более новых версиях bash
(по крайней мере, v2), builtins может быть загружен (через enable -f filename commandname
) во времени выполнения. Много таких загружаемых builtins также распределяются с источниками удара, и sleep
среди них. Доступность может отличаться от ОС до ОС (и даже машина к машине), конечно. Например, на openSUSE, эти builtins распределяются через пакет bash-loadables
.
Править: зафиксируйте имя пакета, добавьте минимальную версию удара.
Создание большого количества подпроцессов является плохой вещью во внутреннем цикле. Создание того 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
mkdir
поскольку это сделано mktemp
(в противном случае это - состояние состязания)). Также верный о while ! test_condition;
который более хорош, чем мое начальное решение.
– jfg956
18.03.2013, 11:25
В ksh93
или mksh
, sleep
встроенная оболочка, таким образом, альтернатива могла бы быть должна использовать те оболочки вместо bash
.
zsh
также имеет a zselect
встроенный (загруженный zmodload zsh/zselect
) это может спать для данного числа сотых частей секунд с zselect -t <n>
.
Вам действительно нужен FIFO? Перенаправление stdin к другому дескриптору файла должно работать также.
{
echo line | while read line; do
read -t 1 <&3
echo "$line"
done
} 3<&- 3<&0
Вдохновленный: Считайте вход в ударе внутри некоторое время цикл
Как сказал пользователь yoi , если в вашем скрипте открыт stdin , то вместо sleep 1 вы можно просто использовать:
read -t 1 3<&- 3<&0 <&3
В Bash версии 4.1 и новее вы можете использовать число с плавающей запятой, например read -t 0.3 ...
Если в скрипте stdin закрыт (скрипт называется my_script.sh dev / null &
), то вам нужно использовать другой открытый дескриптор, который не производит вывод при выполнении read , например. stdout :
read -t 1 <&1 3<&- 3<&0 <&3
Если в скрипте весь дескриптор закрыт ( stdin , stdout , stderr ) (например, потому что вызывается как демон), то вам нужно найти любой существующий файл, который не производит вывод:
read -t 1 </dev/tty10 3<&- 3<&0 <&3
Небольшое улучшение вышеупомянутых решений (, которое я основал на ).
bash_sleep() {
read -rt "${1?Specify sleep interval in seconds}" -u 1 <<<"" || :;
}
# sleep for 10 seconds
bash_sleep 10
Уменьшена потребность в fifo и, следовательно, в очистке.
sleep
как встроенное.Спасибо. – jfg956 18.03.2013, 14:46