Как сохранить вывод find из фоновой команды

У меня есть следующий отрывок из сценария для поиска определенных вложенных папок. Тем временем спиннер показывает, что что-то занимает больше времени в фоне:

# runs find as background task and meanwhile display spinner
# writes to temp file ./.repos
echo -ne "Scanning for .git folders ...  "
find -name ".git" -type d > .repos &
pid=$!
while [ -d /proc/$pid ]
do
    for x in '-' '/' '|' '\'
    do
        echo -ne "\b"$x
        sleep 0.01
    done
done

# read-in result from ./.repos and delete the file
echo ""
repos=$(cat .repos)
rm .repos

Это хорошо и все такое, но мне не нравится запись/чтение в/из файла только для того, чтобы получить список найденных папок.

Поэтому мой вопрос: Как я могу сделать это непосредственно как переменную?

Я пробовал что-то вроде

echo -ne "Scanning for .git folders ...  "
repos=$(find -name ".git" -type d &
    pid=$!
    while [ -d /proc/$pid ]
    do
        for x in '-' '/' '|' '\'
        do
            echo -ne "\b"$x
            sleep 0.01
        done
    done
)

echo "$repos"

но это не сработало, то есть спиннер не выводился, а в конце добавлялся к строке в $repos.

Тогда я решил, что понял проблему и попробовал

echo -ne "Scanning for .git folders ...  "
repos=$(find -name ".git" -type d) &
pid=$!
while [ -d /proc/$pid ]
do
    for x in '-' '/' '|' '\'
    do
        echo -ne "\b"$x
        sleep 0.01
    done
done

echo "$repos"

теперь спиннер работает как ожидалось, но в итоге $repos пуст

0
задан 14 January 2020 в 12:19

1 ответ

Это должно соответствовать вашим потребностям:

echo -ne "Scanning for .git folders ...  "
(
  while :; do
      for x in '-' '/' '|' '\\'
      do
          echo -ne "\b"$x
          sleep 0.01
      done
  done
) &
sub=$!

repos=$(find -name ".git" -type d)

kill $sub
echo -ne "\nFound repos: "
echo "$repos" | wc -l

Возможно, проще сделать наоборот.

0
ответ дан 27 February 2020 в 13:29

Другие вопросы по тегам:

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