Как я получаю код выхода / обрабатывают ошибки правильно при использовании замены процесса?

Если бы Вы просто расширили диск, и программное обеспечение не разрушало MBR раздела окон, то Вы могли попробовать:

> root (hdX,Y)  
> makeactive     # activate NTFS partition
> chainloader +1 # boot
> boot
13
23.05.2017, 15:39
4 ответа

Вы можете довольно легко получить возврат из любого подмножества процессов, эхом посылая его обратно через его stdout. То же самое справедливо и для подстановки процесса:

while IFS= read -r -d $'\0' FILE || 
    ! return=$FILE
do    ARGS[ARGID++]="$FILE"
done < <(find . -type f -print0; printf "$?")

Если я запущу его, то самой последней строкой - (или \0 разграниченный раздел, в зависимости от случая) будет find's return status. прочтение вернет 1, когда получит EOF - поэтому единственное время $возврата установлено на $FILE для самого последнего прочитанного бита информации.

Я использую printf, чтобы не добавлять дополнительный \newline - это важно, потому что даже чтение выполняется регулярно - тот, в котором вы не разделите на \0 NULs - будет возвращаться кроме 0 в случаях, когда только что прочитанные им данные не заканчиваются на \newline. Таким образом, если последняя строка не заканчивается на \newline, то последним значением в переменной read in будет ваш возврат.

Выполнение команды выше, а затем:

echo "$return"

OUTPUT

0

И если я изменю подстановочную часть процесса...

...
done < <(! find . -type f -print0; printf "$?")
echo "$return"

OUTPUT

1

Более простая демонстрация:

printf \\n%s list of lines printed to pipe |
while read v || ! echo "$v"
do :; done

OUTPUT

pipe

И на самом деле, до тех пор, пока возвращаемая часть процесса - это последнее, что вы пишете в stdout из подстановок процесса - или любого подстановленного процесса, из которого вы читаете таким образом - тогда $FILE всегда будет возвращаемым статусом, который вы хотите получить, когда он будет закончен. Поэтому || ! return=... Часть не является строго обязательной - она используется только для демонстрации концепции.

5
27.01.2020, 19:53
[115751] Процессы в процессе замещения являются асинхронными: оболочка запускает их, а затем не дает возможности обнаружить, когда они погибают. Поэтому вы не сможете получить статус выхода.

#!/bin/bash
for i in {2..70}
do
   echo Doing track number $i...
   ./HandBrakeCLI -t $i -i /Volumes/MX1-0N-NW1_DES --preset iPad -o X-Men_Vol1_Disk1_Title$i.mp4
done
Вы можете записать статус выхода в файл, но в целом это неуклюже, потому что вы не можете знать, когда файл будет записан. Здесь файл записывается вскоре после окончания цикла, так что разумно подождать.

Другой подход - использовать именованный канал и фоновый процесс (для которого можно [116243]подождать [116244]).

Если ни один из подходов не подходит, думаю, вам нужно будет обратиться к более способному языку, такому как Perl, Python или Ruby.[115758].

5
27.01.2020, 19:53

Один подход:

status=0
token="WzNZY3CjqF3qkasn"    # some random string
while read line; do
    if [[ "$line" =~ $token:([[:digit:]]+) ]]; then
        status="${BASH_REMATCH[1]}"
    else
        echo "$line"
    fi
done < <(command; echo "$token:$?")
echo "Return code: $status"

Идея состоит в том, чтобы повторить состояние выхода вместе со случайным токеном после завершения команды, а затем использовать регулярные выражения Bash для поиска и извлечения состояния выхода. Токен используется для создания уникальной строки для поиска на выходе.

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

1
27.01.2020, 19:53

Используйте сопроцесс . Используя встроенный coproc , вы можете запустить подпроцесс, прочитать его вывод и проверить его статус выхода:

coproc LS { ls existingdir; }
LS_PID_=$LS_PID
while IFS= read i; do echo "$i"; done <&"$LS"
wait "$LS_PID_"; echo $?

Если каталог не существует, wait выйдет с ненулевым статусом код.

В настоящее время необходимо скопировать PID в другую переменную, потому что $ LS_PID будет сброшен до вызова wait . См. Bash сбрасывает переменную * _PID, прежде чем я смогу дождаться coproc , чтобы узнать подробности.

2
27.01.2020, 19:53

Теги

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