저는 숙제 폴더(소스 파일)를 살펴보고 폴더가 있으면 대상 폴더를 찾는 스크립트를 작업 중입니다. 해당 폴더가 없으면 소스를 대상에 복사합니다.
대상이 존재하는 경우 원본에서 대상으로 파일을 복사하려고 시도하며, 그렇게 하기 전에 해당 사용자가 이미 수행한 작업을 덮어쓰지 않도록 먼저 사용자에게 메시지를 표시합니다.
명령의 출력은 특정 형식이어야 하므로 명령의 표준 출력을 그대로 사용할 수 없습니다. 캡쳐해서 다시 포맷해야겠네요. 그런 다음 특정 형식으로 입력(예: y/N)을 받습니다.
이렇게 하면 복사 명령이 이미 유용한 작업을 수행한다는 이점이 있습니다. 파일이 존재하지 않으면 복사를 수행합니다.
하나의 파일 또는 여러 개의 파일이 이미 존재하는 경우 "overwrite y/n?"이라는 질문이 반복적으로 표시됩니다. 제가 다루려고 하는 것은 바로 이 사건입니다.
복사 명령의 출력을 변수로 캡처하고 일반 출력을 억제하여 출력 형식을 다시 지정하고 해당 형식을 사용자에게 다시 에코할 수 있도록 했습니다.
다음으로 내 생각에는 명령을 종료(또는 어떻게든 중지)한 다음 원하는 형식으로 출력을 인쇄한 다음 명령을 다시 호출하고 두 번째로 y/N 프롬프트를 에코할 수 있다는 것입니다. 내가 원하는 형식을 선택하면 사용자가 선택할 수 있습니다. 검색에도 불구하고 명령이 호출되면 명령을 종료하거나 중지하는 방법을 파악/이해할 수 없습니다. 나는 SIGINT를 사용하여 kill과 다양한 시도를 시도했습니다. 나는 이것을 사용하는 방법을 이해하지 못하거나 올바른 선택이 아닙니다. 사용하려고 하면 구문 오류가 발생합니다.
내 코드는 다음과 같습니다.
#!/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