Почему часы ничего не показывают на экране при вызове с тайм-аутом в скрипте?

Общее решение для замены двух (возможно удаленных )строк, соответствующих определенным регулярным выражениям, наed:

  1. Скопируйте одну строку после второй строки.
  2. Переместите вторую строку после исходной первой строки.
  3. Удалить первую исходную строку.

Или с помощью edкоманд редактирования:

  1. /pat1/t/pat2/
  2. ?pat2?m/pat1/
  3. ?pat1?d

Пример с файлом

CLP*815900102*2*489.8*101.5*82.29*13*PVJLS03YP0000*13*7
AMT*AU*489.8
REF*6R*00000000002
DTM*472*20160528
CAS*OA*23*306.01
CAS*PR*2*82.29
SVC*HC:99212:25*489.8*101.5**1
AMT*B6*411.43

, в котором мы хотели бы поменять местами первую строку AMTсо второй строкой CAS. pat1будет ^AMT\*AUи pat2будет ^CAS\*PR. Обратите внимание, что нам нужно экранировать *, чтобы он обрабатывался буквально в регулярном выражении.

Я аннотировал приведенные ниже изменения, чтобы их было легче увидеть.XXXуказывает текущую позицию в файле после каждой операции.

  1. /^AMT\*AU/t/^CAS\*PR/производит

    CLP*815900102*2*489.8*101.5*82.29*13*PVJLS03YP0000*13*7
    AMT*AU*489.8        <-- Line copied *from* here
    REF*6R*00000000002
    DTM*472*20160528
    CAS*OA*23*306.01
    CAS*PR*2*82.29
    AMT*AU*489.8        <-- Line copied *to* here (XXX)
    SVC*HC:99212:25*489.8*101.5**1
    AMT*B6*411.43
    
  2. ?^CAS\*PR?m/^AMT\*AU/производит

    CLP*815900102*2*489.8*101.5*82.29*13*PVJLS03YP0000*13*7
    AMT*AU*489.8
    CAS*PR*2*82.29      <-- line moved here (XXX)
    REF*6R*00000000002
    DTM*472*20160528
    CAS*OA*23*306.01
    AMT*AU*489.8        <-- line previous to this deleted
    SVC*HC:99212:25*489.8*101.5**1
    AMT*B6*411.43
    
  3. ?^AMT\*AU?dпроизводит

    CLP*815900102*2*489.8*101.5*82.29*13*PVJLS03YP0000*13*7
    CAS*PR*2*82.29      <-- the line before this was removed (XXX)
    REF*6R*00000000002
    DTM*472*20160528
    CAS*OA*23*306.01
    AMT*AU*489.8
    SVC*HC:99212:25*489.8*101.5**1
    AMT*B6*411.43
    

В качестве простого -к -помните «один -вкладыш»:

pat1='^AMT\*AU'; pat2='^CAS\*PR'; printf '/%s/t/%s/\n?%s?m/%s/\n?%s?d\nwq\n' "$pat1" "$pat2" "$pat2" "$pat1" "$pat1" | ed -s file

Обратите внимание, что это можно исправить, запустив то же самое во второй раз, т. е. не имеет значения, какой шаблон будет первым или вторым.

9
21.07.2020, 21:02
1 ответ

Поведение timeoutотличается, когда он запускается из сценария оболочки. Опция --foregroundвызывает «интерактивное» поведение по умолчанию, даже при запуске из скрипта. Из справочной страницы:

--foreground

    when not running timeout directly from a shell prompt, allow COMMAND to
    read from the TTY and get TTY signals; in this mode, children of
    COMMAND will not be timed out

И watchдолжен писать в терминал, чтобы выполнять все свои причудливые трюки с ANSI.

Если вы хотите увидеть это в действии, попробуйте следующее:

$ script -c 'timeout --foreground 5s watch -n 1 ps'
$ less typescript
1
18.03.2021, 23:18

Теги

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