Intereting Posts
virt-manager копировать и вставлять, можно отключить его? Как читать dmesg с предыдущего сеанса? (dmesg.0) Экран GNU: эквивалент соответствия в tmux Как сделать текст значков рабочего стола XFCE прозрачным? Debian: Как получить текущее имя загруженного ядра? Юлийский календарь для британского языка в ncal Как создать псевдоним, но поэтому я могу ввести в другую информацию команду Могут ли команды tr быть закодированы, чтобы избежать нескольких tr процессов в конвейере? контейнер userns не запускается, как отслеживать причину? Не удалось импортировать cv2 в python2 Правила udev не запускают скрипт при добавлении USB-устройства Как создать окно X, которое не будет закрыто каким-либо образом, кроме команды терминала Должен ли я помещать заявку в / usr / local или / usr / local / share? Измерьте время выполнения команды, включая расширение подстановки команд Как использовать sox или ffmpeg для определения интервалов молчания в длинном звуковом файле и их замены нулями (например, подавление фонового шума)?

Как я могу игнорировать «zip warning: name not match» при использовании команды zip с опцией -d?

Я создаю sh-файл для запуска нескольких команд в фоновом режиме.

В некоторой строке этого файла есть команда для обновления zip-файла, например:

zip -d archive.zip file.txt 

Этот файл.txt не всегда является частью файла archive.zip. Когда это не так, сценарий оболочки разбивается на эту строку с помощью:

 zip warning: name not matched 

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

Обычно в сценарии оболочки даже строка, которая генерирует ошибку, не останавливает выполнение сценария оболочки. Он просто перейдет к следующей строке.

Заметное исключение – если вы установили флаг для его выхода из оболочки, если какая-либо подкоманда завершилась с ошибкой. Иногда это делается путем добавления «set -e» в верхней части скрипта. Если в вашем скрипте есть что-то подобное, он прекратит выполнение любой команды в скрипте, возвращая ошибку. Ваши варианты в этом случае:

  • Удалите эту опцию. Это может иметь последствия для остальной части вашего скрипта, поэтому не делайте этого по прихоти.

  • Переключите параметр в разделе сценария, в котором вы находитесь, затем верните его, чтобы продолжить:

     set +e zip -d archive.zip file.txt set -e 
  • Обеспечьте выход для линии сбоя, чтобы оболочка воспринимала команду как успешную, даже если что-то не получилось. Это можно сделать много, но один простой – использовать оператор OR:

     zip -d archive.zip file.txt || true 

    Это запустит zip-команду, но если она не удастся, она запустит настоящую команду, а родительская оболочка получит код возврата из этого (что, конечно, имеет успех). Вы могли бы видеть, что это иногда написано ||: это немного быстрее и сложнее, но не волшебство; : просто случается, что команда shell не содержит команду no-op, которая также вернет код ошибки успеха, даже если он ничего не делает.

    Другой способ сделать это – запустить команду в суб-оболочке, окружив ее в () так что, хотя команда внутри нее может выйти из строя, подоболочка выполнит свою работу, поэтому родительский скрипт с set -e не будет умереть. Это неоптимально для одной команды, но может быть полезно, если вы хотите запустить целый набор вещей.

С другой стороны, если вы просто хотите подавить сообщение об ошибке, генерируемое zip, вы можете перенаправить поток ошибок stardard в / dev / null с помощью ( 2> /dev/null ), чтобы подавить сгенерированные сообщения (или закрыть его с помощью 2>&- ).