私は宿題フォルダ (ソース ファイル) を調べ、フォルダが存在する場合は宛先フォルダを検索するスクリプトを作成しています。そのフォルダが存在しない場合は、ソースを宛先にコピーします。
宛先が存在する場合は、ソースから宛先にファイルをコピーしようとしますが、その前に、そのユーザーがすでに行った作業を上書きしないように、まずユーザーに確認を求めます。
コマンドの出力は特定の形式でなければならないため、コマンドの標準出力をそのまま使用することはできません。それをキャプチャして再フォーマットする必要があります。次に、特定の形式で入力 (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を使用できます。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