Труба проходит с двух сторон параллельно. Способ, которым вы пытаетесь это сделать, концептуально невозможен :вы не можете проверить статус команды mysqldump
до ее завершения, если вы выполняете этот тест параллельно с выполнением mysqldump
. Вам нужно запустить mysqldump
, дождаться его завершения и , затем решить, запускать ли gzip
.
Поскольку mysqldump
должен закончить работу, его вывод должен куда-то идти. Предположительно, вы ожидаете, что результат будет большим, так как вы его сжимаете. Поэтому разумный вариант — сжать его. Поэтому безоговорочно сжимайте вывод.
mysqldump -u username -ppassword dbname | gzip > test.gz
Обратите внимание, что я использовал |
, а не |&
. Использование |&
здесь не имеет смысла :если есть какие-либо сообщения об ошибках, они в конечном итоге смешаются с дампом, и восстановить дамп будет невозможно.
Проблема, которую еще предстоит решить, заключается в том, чтобы определить, удалось ли mysqldump
. Предполагая, что это сценарий bash или ksh (, т. е. он начинается с #!/bin/bash
или #!/bin/ksh
или подобного, а не с #!/bin/sh
), установите параметр pipefail
, чтобы конвейер давал сбой при сбое какой-либо части. (По умолчанию состоянием конвейера является состояние его самой правой команды, а состояние других команд игнорируется.)
#!/bin/bash
set -o pipefail -o errexit
tmp="mydump.tmp.$$.gz"
trap 'rm -f "$tmp"' ERR INT TERM HUP
mysqldump … | gzip >"$tmp"
mv "$tmp" mydump.gz
Установка параметра errexit
гарантирует, что в случае сбоя конвейера сценарий завершится в этой точке (с тем же статусом ошибки, что и конвейер ). Таким образом, файл с именем mydump.gz
создается только в случае успешного создания дампа. Команда trap
устанавливает ловушку, так что в случае сбоя сценария или его уничтожения одним из перечисленных сигналов временный файл удаляется.
Использовать расширение фигурной скобки:
mv -some_flag db/migrations/abc_201911{201243,01090000}.php
Думаю, я уже нашел подходящее решение :вы меняете каталог и затем возвращаетесь .
cd db/migrations/ && mv abc_201911201243.php abc_20191101090000.php && cd ~-