zip работает в терминале, а не внутри скрипта? - PullRequest
0 голосов
/ 07 мая 2019

Я пишу bash-скрипт на основе zenity, который позволяет пользователю выбирать файлы для сжатия и сжимает их с помощью zip. Проблема в том, что всякий раз, когда я добираюсь до "молнии", это не работает. С другой стороны, когда я пишу точно такую ​​же команду прямо в терминал, все идет хорошо, и появляется новый zip-файл.

Конечно, у меня есть #!/bin/bash в верхней части кода моего скрипта. Я пробовал два вида команд, с кавычками и апострофами (в терминале апострофы допускают имена файлов из нескольких слов, в то время как кавычки работают только с именами файлов из одного слова), но ни одна из них не работает. Вот как я использую команды:

Команды:

    zip 'file name.zip' '/home/user/filetozip.txt'
    zip "file name.zip" "/home/user/filetozip.txt"

Оба варианта оставляют меня с этим (конечно, один печатает апострофы, а другой - кавычки):

    zip warning: name not matched: name.zip'
    zip warning: name not matched: '/home/user/filetozip.txt'
    zip error: Nothing to do! ('file.zip)

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

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


Вот часть скрипта, отвечающая за сжатие:

    FILE=`zenity --file-selection --title "Choose the file for compression"`
    NAME=`zenity --entry --title "File name" --text "Enter the name for the zip file:"`
    zenity --question --title "Encryption" --text="Do you want your zip file to be password protected?" --ok-label="Yes" --cancel-label="No" --width 230
    if [[ $? -eq 0 ]]; then
       PASS=`zenity --password --title "Password" --text "Enter password:" --width 250`
       while [[ -z $PASS ]]; do
       zenity --error --title "Error" --text "Empty password" --width 200
       PASS=`zenity --password --title "Password" --text "Enter password:" --width 250`
       done
       #zip with password
       ODP="-P ${PASS} '${NAME}.zip' '${FILE}'"
    else #zip without password
       ODP="'${NAME}.zip' '${FILE}'"
    fi
    zip $ODP

1 Ответ

1 голос
/ 07 мая 2019

Пожалуйста, убедитесь, что вы проверяли свой код сначала через https://www.shellcheck.net, чтобы избежать распространенных проблем с оболочкой.

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

  FILE=$(zenity --file-selection --title "Choose the file for compression")
    NAME=$(zenity --entry --title "File name" --text "Enter the name for the zip file:")
    zenity --question --title "Encryption" --text="Do you want your zip file to be password protected?" --ok-label="Yes" --cancel-label="No" --width 230
    if [[ $? -eq 0 ]]; then
       PASS=$(zenity --password --title "Password" --text "Enter password:" --width 250)
       while [[ -z $PASS ]]; do
       zenity --error --title "Error" --text "Empty password" --width 200
       PASS=$(zenity --password --title "Password" --text "Enter password:" --width 250)
       done
       #zip with password
       ODP=(-P "${PASS}" "${NAME}".zip "${FILE}")
    else #zip without password
       ODP=("${NAME}.zip" "${FILE}")
    fi
    zip "${ODP[@]}"
...