退出腳本中的 bash 指令而不退出腳本

退出腳本中的 bash 指令而不退出腳本

我正在編寫一個腳本,該腳本查看作業資料夾(來源檔案),如果該資料夾存在,則它會查找目標資料夾。如果該資料夾不存在,則會將來源複製到目標。

如果目標存在,它會嘗試將檔案從來源複製到目標,在執行此操作之前,首先提示用戶,以免覆蓋該用戶已完成的工作。

命令的輸出必須採用特定格式,因此我無法按原樣使用命令的標準輸出。我必須捕獲它並重新格式化它。然後以特定格式取得輸入(即 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"行才能進行實際複製。出於測試目的,替換cpecho第一個。

#!/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

相關內容