выйдите из команды удара в сценарии, не выходя из сценария

Я работаю над сценарием, который смотрит на папку домашней работы (исходные файлы) и если папка существует, она затем ищет папку назначения. Если та папка не существует, она копирует источник в место назначения.

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

Вывод команды должен быть в определенном формате, таким образом, я не могу использовать стандартный вывод команды, как. Я должен получить его и переформатировать его. Затем возьмите вход (т.е. y/N) в определенном формате.

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

Если файл или несколько файлов уже будет существовать, то он будет неоднократно просить "перезаписывать y/n?" Именно этот случай, я пытаюсь иметь дело с.

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

Затем, мои взгляды состоят в том, что я должен уничтожить (или иначе остановить команду так или иначе), затем распечатайте вывод в моем нужном формате и затем повторно вызовите команду и на второй раз, когда я могу повторить подсказку y/N в своем нужном формате, и пользователь может затем сделать их выбор. Несмотря на поиск, я не смог к фигуре/, понимают, как уничтожить или иначе остановить команду, после того как это вызывается. Я попробовал, уничтожают и различные попытки использования SIGINT. Или я просто не понимаю, как использовать их, или они не правильный выбор. Когда я пытаюсь использовать их, я получаю синтаксическую ошибку.

Вот мой код:

#!/bin/bash

USAGE="Usage: ./script2.sh [hw-name]"
EINVALID="Invalid homework: $1"
SOURCEDIRECTORY="$PUBLIC/homework/$1"
HOMEWORKDIRECTORY="$HOME/homework/$1"
COPY="$SOURCEDIRECTORY/*.*"

if [ -z "$1" ]; then
    echo $USAGE
    exit
fi

if [ ! -d "$SOURCEDIRECTORY" ]; then
    echo $EINVALID
    exit
fi

if [ ! -d "$HOMEWORKDIRECTORY" ]; then
    echo "making homework1"
    mkdir -p $HOMEWORKDIRECTORY

copyOutput2="$(eval cp -ir $COPY $HOMEWORKDIRECTORY 2>&1 &stop this
 process somehow)"
echo $copyOutput2 #temporary output for testing
6
задан 2 June 2018 в 15:19

1 ответ

Если действительно действительно действительно нужно иметь пользовательский cp с пользовательским сообщением, затем перекомпилировав программу из источника способ пойти, но немного более разумный подход должен был бы выписать Ваше собственное сообщение через printf предпочтительно, вместо того, чтобы пытаться прервать cpвывод и пользовательский выбор дескриптора через select диалоговое окно. Кроме того, если Вы идете в сообщения ошибки на выходе, они должны перейти в stderr поток. Наконец, *.* является ненужным, и можно просто использовать * шарик вместо этого.

Ниже сценарий с парой редактирований. Обратите внимание, что необходимо не прокомментировать #cp "$item" "$HOMEWORKDIRECTORY" строка для фактического копирования для появления. Для тестирования замена cp с echo сначала.

#!/bin/bash

USAGE="Usage: ./script2.sh [hw-name]"
EINVALID="Invalid homework: $1"
SOURCEDIRECTORY="$PUBLIC/homework/$1"
HOMEWORKDIRECTORY="$HOME/homework/$1"
#COPY="$SOURCEDIRECTORY/*.*"

if [ -z "$1" ]; then
    echo "$USAGE" > /dev/stderr
    exit 1
fi

if [ ! -d "$SOURCEDIRECTORY" ]; then
    echo "$EINVALID" > /dev/stderr
    exit 2
fi

if [ ! -d "$HOMEWORKDIRECTORY" ]; then
    echo "making homework1"
    mkdir -p $HOMEWORKDIRECTORY

for item in "$SOURCEDIRECTORY"/*; do
    skip=true
    if [ -f "$HOMEWORKDIRECTORY"/"${item##*/}" ]; then
        printf "%s already exists in %s.\n" "$item" "$HOMEWORKDIRECTORY"

        select choice in  "overwrite" "skip"; do
            case "$choice" in 
                "overwrite")  echo "Overwriting."  
                              break;;
                "skip") skip=true; break;;
            esac
        done
    fi

    if [ "$skip" = "true" ]; then
        continue
    fi
    echo cp "$item" "$HOMEWORKDIRECTORY"

done
4
ответ дан 23 November 2019 в 07:59

Другие вопросы по тегам:

Похожие вопросы: