我正在編寫一個腳本,該腳本查看作業資料夾(來源檔案),如果該資料夾存在,則它會查找目標資料夾。如果該資料夾不存在,則會將來源複製到目標。
如果目標存在,它會嘗試將檔案從來源複製到目標,在執行此操作之前,首先提示用戶,以免覆蓋該用戶已完成的工作。
命令的輸出必須採用特定格式,因此我無法按原樣使用命令的標準輸出。我必須捕獲它並重新格式化它。然後以特定格式取得輸入(即 y/N)。
這樣做的好處是複製命令已經做了一些有用的事情。如果文件不存在,則會進行複製。
如果一個或多個檔案已經存在,它會反覆詢問“覆蓋是/否?”我正在嘗試處理的就是這個案子。
我已經做到了將複製命令的輸出捕獲到變數中並抑制其正常輸出,以便我可以重新格式化其輸出並將該格式回顯給使用者。
接下來,我的想法是我需要終止(或以某種方式停止命令),然後以我想要的格式列印輸出,然後重新呼叫該命令,第二次,我可以回顯 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
最好透過 寫出您自己的訊息,而不是嘗試攔截 的cp
輸出,並透過select
對話框處理用戶選擇。此外,如果您要輸出錯誤訊息,它們應該進入stderr
串流傳輸。最後,*.*
這是不必要的,你可以使用*
glob 來代替。
下面是經過一些編輯的腳本。請注意,您需要取消註解#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