Si bien su código está bien escrito, hay mucha duplicación. Aquí hay una versión más condensada:
#!/bin/bash
declare -A count
for file in demo_room/subject_1/*; do
base=${file##*/}
case $base in
slide_[12]*) key=${base:0:7};;
[ldopt]*) key=${base:0:1};;
*) ;; # other types ignored
esac
(( count[$key]++ ))
echo "$key=${count[$key]}"
python motempl_n.py "$file" "${count[$key]}"
done
Estoy usando una matriz asociativa en lugar de distintas variables enteras, pero afortunadamente bash maneja la aritmética (( an_unset_variable++ ))
con gracia y asigna "1" a la variable.
Tenga en cuenta que el ?
en su ?*
era redundante ya que los nombres de archivo siempre contienen al menos un carácter, por lo que no hay ningún archivo que coincida con*
(0 o más caracteres )y?*
(1 o más los caracteres )no lo harían.
Комментарии из источника texinfo немного более явные:
@deftypefun {unsigned int} sleep (unsigned int @var{seconds})
@standards{POSIX.1, unistd.h}
@safety{@prelim{}@mtunsafe{@mtascusig{:SIGCHLD/linux}}@asunsafe{}@acunsafe{}}
@c On Mach, it uses ports and calls time. On generic posix, it calls
@c nanosleep. On Linux, it temporarily blocks SIGCHLD, which is MT- and
@c AS-Unsafe, and in a way that makes it AC-Unsafe (C-unsafe, even!).
За исключением того, что это ложь; sleep(3)
в Linux не будет блокировать SIGCHLD
; это всего лишь остатки старого обходного пути (, удаленного в 2015 году)для еще более старой ошибки Linux (, исправленной в 2.6.32 ).
Это коммит , который представил этот язык:
* manual/time.texi: Document MTASC-safety properties.
author Alexandre Oliva <aoliva@redhat.com>
Sat, 1 Feb 2014 04:51:51 +0000 (02:51 -0200)
committer Alexandre Oliva <aoliva@redhat.com>
Sat, 1 Feb 2014 04:51:51 +0000 (02:51 -0200)
commit 23e5b8cb1ba7a31450bda75e3f06b7c76e175db4
Тот, у кого больше опыта работы с внутренностями Linux, может меня поправить, но из документации похоже, что они хотят оставить за собой право реализовать sleep()
через alarm()
, что временно установит обработчик для SIGALRM
.
Это не тот SIGCHLD
, который упоминается в фактической документации, но он все равно подпадает под «MT -Небезопасный сигнал».