在后台任务运行时运行一个函数,并将stdout返回给变量

时间:2019-07-10 13:35:52

标签: bash shell

我很难定义正确的标题。我正在寻找一种仍能获得我运行的命令结果/响应的方法,同时我使用&将其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 个答案:

答案 0 :(得分:2)

老实说,在这里要做的最简单的事情是使用一个临时文件。还有其他方法,但是它们都很难看。

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")

答案 1 :(得分:0)

虽然Charles解决方案是完美的,但这是我从中构建的:

#
# 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