Ответ Александра Миллса, который использует handleJobs, дал мне отличную отправную точку, но также дал мне эту ошибку
warning: run_pending_traps: bad value in trap_list[17]: 0x461010
Это может быть гонка bash -проблема с условием
Вместо этого я просто сохранял pid каждого потомка, ждал и получал код выхода для каждого потомка конкретно. Я нахожу это чище с точки зрения подпроцессов, порождающих подпроцессы в функциях, и избегания риска ожидания родительского процесса там, где я хотел дождаться дочернего. То, что происходит, понятнее, потому что ловушка не используется.
#!/usr/bin/env bash
# it seems it does not work well if using echo for function return value, and calling inside $() (is a subprocess spawned?)
function wait_and_get_exit_codes() {
children=("$@")
EXIT_CODE=0
for job in "${children[@]}"; do
echo "PID => ${job}"
CODE=0;
wait ${job} || CODE=$?
if [[ "${CODE}" != "0" ]]; then
echo "At least one test failed with exit code => ${CODE}" ;
EXIT_CODE=1;
fi
done
}
DIRN=$(dirname "$0");
commands=(
"{ echo 'a'; exit 1; }"
"{ echo 'b'; exit 0; }"
"{ echo 'c'; exit 2; }"
)
clen=`expr "${#commands[@]}" - 1` # get length of commands - 1
children_pids=()
for i in `seq 0 "$clen"`; do
(echo "${commands[$i]}" | bash) & # run the command via bash in subshell
children_pids+=("$!")
echo "$i ith command has been issued as a background job"
done
# wait; # wait for all subshells to finish - its still valid to wait for all jobs to finish, before processing any exit-codes if we wanted to
#EXIT_CODE=0; # exit code of overall script
wait_and_get_exit_codes "${children_pids[@]}"
echo "EXIT_CODE => $EXIT_CODE"
exit "$EXIT_CODE"
# end
Я вижу 3 решения (1-е мощное, 2-е простое, 3-е быстрое):
дрель apache . Он может анализировать TSV среди многих других форматов. Хотя, если это редкий случай, когда вы сталкиваетесь с такой проблемой, это может быть слишком тяжелым.
используйте python или perl oneliner, чтобы просто разделить строку и повторно обработать ее, например:
$ ps ax | head
PID TTY STAT TIME COMMAND
1 ? Ss 2:40 /sbin/init
2 ? S 0:08 [kthreadd]
3 ? S 0:00 [ksoftirqd/0]
5 ? S< 0:00 [kworker/0:0H]
8 ? S 13:32 [rcu_sched]
9 ? S 0:00 [rcu_bh]
10 ? S 0:07 [migration/0]
11 ? S< 0:00 [lru-add-drain]
12 ? S 0:18 [watchdog/0]
$ ps ax | head |perl -n -e 'sub mynormalize($){ $r = shift;$r->[4]=substr($r->[4], 0, 2); return $r}; my @row = split; print(join("\t", @{ normalize(\@row) }), "\n"); '
PID TTY STAT TIME CO
1 ? Ss 2:40 /s
2 ? S 0:08 [k
3 ? S 0:00 [k
5 ? S< 0:00 [k
8 ? S 13:32 [r
9 ? S 0:00 [r
10 ? S 0:07 [m
11 ? S< 0:00 [l
12 ? S 0:18 [w