Если бы Вы просто расширили диск, и программное обеспечение не разрушало MBR раздела окон, то Вы могли попробовать:
> root (hdX,Y)
> makeactive # activate NTFS partition
> chainloader +1 # boot
> boot
Вы можете довольно легко получить возврат из любого подмножества процессов, эхом посылая его обратно через его 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
, чтобы не добавлять дополнительный \n
ewline - это важно, потому что даже чтение
выполняется регулярно - тот, в котором вы не разделите на \0
NULs - будет возвращаться кроме 0 в случаях, когда только что прочитанные им данные не заканчиваются на \n
ewline. Таким образом, если последняя строка не заканчивается на \n
ewline, то последним значением в переменной read in будет ваш возврат.
Выполнение команды выше, а затем:
echo "$return"
0
И если я изменю подстановочную часть процесса...
...
done < <(! find . -type f -print0; printf "$?")
echo "$return"
1
Более простая демонстрация:
printf \\n%s list of lines printed to pipe |
while read v || ! echo "$v"
do :; done
pipe
И на самом деле, до тех пор, пока возвращаемая часть процесса - это последнее, что вы пишете в stdout из подстановок процесса - или любого подстановленного процесса, из которого вы читаете таким образом - тогда $FILE
всегда будет возвращаемым статусом, который вы хотите получить, когда он будет закончен. Поэтому || ! return=... Часть
не является строго обязательной - она используется только для демонстрации концепции.
#!/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]).
Один подход:
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.
Используйте сопроцесс . Используя встроенный 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 , чтобы узнать подробности.