Это должно обрабатывать любой не -цифровой разделитель (0 -9 ). Пример:
x='1!4!3!5!2'; delim=$(echo "$x" | tr -d 0-9 | cut -b1); echo "$x" | tr "$delim" '\n' | sort -g | tr '\n' "$delim" | sed "s/$delim$/\n/"
Выход:
1!2!3!4!5
Это не решение "Ctrl+C", но что-то, если вы хотите "изящно" остановить длинную последовательность циклов. Все, что вам нужно сделать, это создать файл ./stop-foo-py
; с $ echo "" >./stop-foo-py
например (в другом терминале ).
rm./stop-foo-py
time for ((i=0;i<1000;i++));
do if [ ! -f "./stop-foo-py" ]; then
python foo.py ;
fi ;
done
или rm./stop-foo-py; time for ((i=0;i<1000;i++)); do if [ ! -f "./stop-foo-py" ]; then python foo.py ; fi ; done
в одну строку.
Он добавляет примерно половину мс на один цикл.
$ time for ((i=0;i<1000;i++)); do if [ ! -f "./stop" ]; then : ; fi ; done
real 0m0.548s
user 0m0.157s
sys 0m0.359s
Это невозможно с Ctrl-C
, так как вы генерируете новые процессы в цикле. Вы должны были бы прервать их все, нажимая Ctrl-C
100, 1000 раз быстрее, чем выполняется каждая итерация.
В качестве альтернативы вы можете добиться того же эффекта в bash
, нажав Ctrl-Z
, что остановит последний процесс переднего плана, созданный циклом, и выйдет из самого цикла.
Предполагая, что оболочка zsh
, просто выполните:
time (repeat 10 python3 foo.py)
Это время процесса (и ожидания дочерних элементов ), которые запускают подоболочку, которая запускает команду python3 10 раз.
С помощью bash
илиksh93
(илиzsh
)вы можете выполнить:
time (for ((i=0;i<10;i++)) { python3 foo.py; })
POSIXly вы можете сделать:
time -p sh -c '
i=0; while [ "$i" -lt 10 ]; do
python3 foo.py
i=$((i + 1))
done'