スクリプトを終了せずにスクリプト内の bash コマンドを終了する

スクリプトを終了せずにスクリプト内の bash コマンドを終了する

私は宿題フォルダ (ソース ファイル) を調べ、フォルダが存在する場合は宛先フォルダを検索するスクリプトを作成しています。そのフォルダが存在しない場合は、ソースを宛先にコピーします。

宛先が存在する場合は、ソースから宛先にファイルをコピーしようとしますが、その前に、そのユーザーがすでに行った作業を上書きしないように、まずユーザーに確認を求めます。

コマンドの出力は特定の形式でなければならないため、コマンドの標準出力をそのまま使用することはできません。それをキャプチャして再フォーマットする必要があります。次に、特定の形式で入力 (y/N など) を取得します。

これを実行する利点は、コピー コマンドが既に役立つ処理を実行していることです。ファイルが存在しない場合は、コピーが実行されます。

1 つまたは複数のファイルがすでに存在する場合、「上書きしますか y/n?」と繰り返し尋ねられます。私が対処しようとしているのは、まさにこのケースです。

コピー コマンドの出力を変数にキャプチャし、通常の出力を抑制して、出力を再フォーマットし、そのフォーマットをユーザーにエコーバックできるようにしました。

次に、コマンドを強制終了 (または何らかの方法で停止) し、出力を希望の形式で印刷してからコマンドを再度呼び出し、2 回目に y/N プロンプトを希望の形式でエコーし、ユーザーが選択できるようにすることを考えます。検索しても、コマンドが呼び出されたら強制終了または停止する方法がわかりません。kill や 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

答え1

本当に本当にcpカスタム メッセージが必要な場合は、プログラムをソースから再コンパイルするのが最善の方法ですが、より賢明な方法は、の出力printfを傍受するのではなく、を介して独自のメッセージを書き出し、ダイアログを介してユーザーの選択を処理することです。また、エラー メッセージを出力する場合は、ストリームに出力する必要があります。最後に、は不要であり、代わりに globを使用できます。cpselectstderr*.**

以下は、いくつかの編集を加えたスクリプトです。#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

関連情報