Запустите функцию во время выполнения фоновой задачи и верните stdout в переменную - PullRequest
0 голосов
/ 10 июля 2019

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

  sizeondisk=$(du -hs "$path" | cut -f1) &
  spinner "" "Getting file size for $path..."

Таким образом, во время выполнения команды отображается индикатор загрузки, и после ее завершения она должна вернуть возвращаемое значение (в данном случае размер файла) и передать его в переменную.

Вот функция вращения:

spinner() {
  local pid=$!
  exitCode=0

  ...spinning here...

  wait $pid &>/dev/null
  exitCode=$?

  return $exitCode
}

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Честно говоря, проще всего здесь использовать временный файл. Есть и другие подходы, но все они довольно безобразны.

tempfile=$(mktemp -t result.XXXXXX)
{ du -hs "$path" | cut -f1; } >"$tempfile" & pid=$!
while kill -0 "$pid" && sleep 1; do
  echo "Spinning..." >&2
done
wait "$pid"; exitCode=$?
sizeondisk=$(<"$tempfile")
0 голосов
/ 11 июля 2019

Хотя решение Чарльза идеально, вот что я из него построил:

#
# sizeondisk=$(fileSize $path)
#
fileSize() {
  local path="$1"
  tempfile=$(mktemp -qt filesize.XXXXX)
  { du -hs "$path" | cut -f1; } >"$tempfile" &
  spinner "" "Getting file/dir size for $path..."
  sizeondisk=$(<"$tempfile")
  sizeondisk="${sizeondisk// /}"
  echo "$sizeondisk"
  rm -rf "$tempfile"
}

Любой, кому интересно, как выглядит счетчик, вот он: https://github.com/muuvmuuv/scripts/blob/master/spinner.sh

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...