Подождите, пока поток stdout завершится, а затем добавьте его содержимое в файл

Я пытаюсь запустить команду в bash, где у меня есть command 1 которая принимает большое количество контента через stdin, а затем выводит этот контент в file.txt , однако command 1 генерирует поток контента и, видимо, file.txt создается как только command 1 запускается, а затем обновляется, как только command 1 заканчивается правильным выходом.

 echo 'a lot of content' | command 1 > file.txt 

Проблема в том, что я только хочу создать или коснуться file.txt только command 1 будет полностью закончена.

Есть ли способ достичь этого?

Редактировать:

Пример использования. Я использую сервер веб-разработки, который обновляется каждый раз, когда файл изменяется, поэтому я делаю предварительную обработку перед фактическим обновлением файла.

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

Таким образом, мне нужна только одна команда, которая является command 1 а затем, после обновления file.txt , мой сервер веб-разработки автоматически обновится.

  • bash добавление 1 к переменной в цикле while
  • Выполнение команд последовательно на основе вывода журнала
  • Вычислить сумму даты
  • получить приглашение оболочки в python
  • Как очистить содержимое файла журнала ретрансляции в оболочке?
  • Массивы в Zsh. Проверьте, не определена ли какая-либо из следующих переменных
  • Использовать root для создания корневой оболочки для другого пользователя
  • Что более идиоматично в сценарии bash: `|| true` или `|| : `?
  • 2 Solutions collect form web for “Подождите, пока поток stdout завершится, а затем добавьте его содержимое в файл”

    Простейшим решением является, вероятно, sponge как предложил @heemayl . Кроме того, вы можете сделать что-то вроде этого:

     command > tmpfile && mv tmpfile watched_file 

    Это приведет к тому, что command сохранит свой вывод в tmpfile , который будет только переименован в watched_file (файл, на который настроен ваш сервер для просмотра) после выхода команды и только в том случае, если она успешно завершилась. Чтобы также переименовать его при сбое, используйте:

     command > tmpfile; mv tmpfile watched_file 

    Используйте sponge из GNU moreutils :

     echo 'a lot of content' | command 1 | sponge file.txt 

    Или используйте временный файл.

    Linux и Unix - лучшая ОС в мире.