Показать ход выполнения цикла for после его запуска

Дата Солярис/Экс

К сожалению, нет решения, возможного только с (датой )Solaris/Aix.

Дата GNU

Если доступна дата gnu:

Построить нужную дату в переменной:

$ date +'%Y/%m/01 -9 months'
2017/07/01 -9 months
$ a=$(date +'%Y/%m/01 -9 months')
$ a=$(date -d "$a" +'%Y%m%d')
$ a='MHHHRGFILE ('"$a"') 99991231'
$ echo "$a"
MHHHRGFILE (20161001) 99991231

Или просто:

$ a=$(date -d "$(date +'%Y/%m/01 -9 months')" +'%Y%m%d')
$ a='MHHHRGFILE ('"$a"') 99991231'

Баш

Если доступен bash (4.2+ ):(используя 272 дня как эквивалентные 9 месяцам)

$ TZ=UTC0 printf '%(%Y%m01)T' $(($(date +'%s') - 3600*24*272))
20161001

$ a=$(TZ=UTC0 printf '%(%Y%m01)T' $(($(date +'%s') - 3600*24*272)))

кш93

Если ksh доступен:

$ printf "%(%Y%m%d)T" "9 month ago"

Перл

Если доступен Perl (9 месяцев приблизительно равны 3600 *24 *30 *9):

$ perl -e 'use POSIX qw(strftime); print strftime "%Y%m01",localtime(time()- 3600*24*30*9);'
20161001

$ a=$(perl -e 'use POSIX qw(strftime); print strftime "%Y%m01",localtime(time()- 3600*24*30*9);')

Редактировать файл

Добавить эту переменную к первой строкеfile

$ sed '1s/.*/&'"$a"'/' file >file.new; mv file.new file

Вот именно.

1
21.09.2019, 15:52
1 ответ

Подстановочные знаки, такие как dir/*, всегда расширяются в одном и том же порядке. Эта функция вместе с текущим значением $iможет использоваться для отображения информации о ходе выполнения.

Текущее значение $iможно получить, просмотрев процессы, запущенные в вашей системе. Команда , следующая за , выводит текущий запущенный экземпляр programи его аргументы.
Если есть несколько процессов program, вы можете использовать опцию --parent...для pgrep, чтобы сопоставлять только процессы, запущенные оболочкой, выполняющей цикл for, который вы хотите проверить.

ps -o args= -fp $(pgrep program)

Извлеките значение $iвручную, а затем получите прогресс, используя

a=(dir/*)
n=$(printf %s\\0 "${a[@]}" | grep -zFxnm1 'the exact value of $i' | cut -f1 -d:) 
echo "Progress: $n / ${#a[@]}"

Это работает при двух предположениях

  1. Содержимое dir/не изменяется во время выполнения цикла. Если programсоздает, переименовывает или удаляет файлы, то числа, скорее всего, неверны.

  2. Вызов programзапускает новый процесс. Если programявляется функцией bash, то для programне будет подпроцесса -. Если сама функция functionвызывает другую программу, которая запускает новый процесс, вы можете найти эту подпрограмму -. Однако,если program— это bash, встроенный -в (команды, перечисленные в help), или чистая функция bash (, которая использует только bashвстроенные -модули ), то вы вышли удачи.

Если у вас есть проблема 2 или ваш цикл forимеет структуру, отличную от той, что указана в вопросе (, например, program < "$1"или очень длинное тело цикла с множеством разных программ ), вы можете чтобы получить некоторую информацию о прогрессе из lsof, просматривая файлы, открытые вашим текущим сеансом оболочки или его дочерними процессами.

4
27.01.2020, 23:17

Теги

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