Как gzip, только если mysqldump не является ошибкой?

Я хочу, чтобы zip дамп sql тогда и только тогда, когда mysqldump не вызывает никаких ошибок. Я пытаюсь ввести неверный пароль, но он все еще выполняет gzip.

mysqldump -u username -ppassword dbname |& if [ $? == 0 ]; then gzip > test.gz; else echo "error"; fi 

Что не так с моей командой или есть лучшее решение?

3 Solutions collect form web for “Как gzip, только если mysqldump не является ошибкой?”

Вы также можете

 mysqldump -someparams dump.sql && gzip dump.sql || echo "Backup failed" 

Или

 mysqldump -someparams dump.sql [[ $? == 0 ]] && gzip dump.sql || echo "Backup failed " 

Я думаю, вы могли бы удалить |& (причина в том, что вам не нужно передавать ни stdout, ни stderr в следующее условие, если что-нибудь, что вы можете просто использовать «;» в качестве разделителя команд). Возможно, что-то вроде этого должно работать:

 #!/bin/bash mysqldump -u myuser -p mypasswd > mydb.dump if [[ $? -eq 0 ]]; then gzip mydb.dump else echo "DB backup failed" fi 

Изменить: чтобы проверить успех gzip, вы можете сделать что-то вроде этого:

 mysqldump -u myuser -p mypasswd | gzip > mydb.dump.gz && echo "success" || echo "failure" 

Труба выполняет две стороны параллельно. То, как вы пытаетесь сделать это, принципиально невозможно: вы не можете проверить статус команды 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 устанавливает ловушку, так что если скрипт терпит неудачу или будет убит одним из перечисленных сигналов, тогда временный файл будет удален.

  • Сценарий для извлечения выбранных записей из файла bibtex
  • Команда Scrot - как сохранить только миниатюру
  • Solaris использует генератор последовательности в начале каждой новой строки
  • Объединение двух файлов данных на основе сравнения столбцов
  • Возможно ли, чтобы переменные bash сохранялись между прогонами
  • Как вставить текст в качестве альтернативы из двух файлов с общим шаблоном
  • Индексирование массива с использованием команды "sed"
  • замените с начала строки на 1 из нескольких шаблонов в конец другой строки со вторым шаблоном
  • Как использовать функцию bash как регулярную команду в цепочке труб?
  • Свернуть несколько повторяющихся частей последовательных строк
  • sed соответствует только во второй строке
  • Linux и Unix - лучшая ОС в мире.