쉘 스크립트 함수에서 cp() 사용이 작동하지 않습니다

쉘 스크립트 함수에서 cp() 사용이 작동하지 않습니다

mkdir은 잘 작동하지만 복사되지 않습니다(오류도 발생하지 않음).

#!/bin/sh

copy_function() {

if $1 $2 $3 $4;then
    echo "copied directory and contents"
else
    echo "failed"
    exit 1
fi
}

copy_function mkdir -p ~/TestFolder/TestFile/
copy_function cp -pr my_data/* /TestFolder/TestFile/

답변1

copy_function() {

if $1 $2 $3 $4;then
    echo "copied directory and contents"
else
    echo "failed"
    exit 1
fi
}

copy_function mkdir -p ~/TestFolder/TestFile/
copy_function cp -pr my_data/* /TestFolder/TestFile/

이 함수를 분해해 보겠습니다. 실제로는 무엇을 합니까?

첫째, 4개의 인수가 필요합니다. 이 숫자보다 더 많은 인수가 제공되면 처음 4개를 제외한 모든 인수가 무시됩니다.

다음으로 시작하는 줄 if:

처음 4개의 위치 인수(이 함수가 수신한 인수)를 다음 조건에 따라 만듭니다.파일을 전역으로 확장한 후 공백에서 단어 분할을 수행합니다.그런 다음 결과 행을 명령으로 실행해 보십시오(첫 번째 단어는 명령으로 사용되고 나머지는 명령에 인수로 전달됩니다).

더 좋은 방법은 다음을 사용하는 것입니다.모두위치 매개변수 및아니요추가 파일 전역 확장 절차와 토큰화를 허용하도록 하는 방법은 다음과 같습니다.

if "$@"; then

다음 줄은 "복사된 디렉터리 및 내용"이라는 메시지를 인쇄합니다. 이 줄의 문제점은 극도로 오해의 소지가 있다는 것입니다.아니요이 기능은 무엇을 하는가? 이 함수는 수신된 첫 번째 인수에 표현된 모든 작업을 수행합니다. 만약 내가 달려간다면 copy_function rm -r -f ~나는 그럴 것이다.실제로내 홈 디렉토리가 삭제되고 있지만 "디렉터리 및 내용이 복사되었습니다"라는 출력 메시지가 나타납니다. 그래서 이 대사는 거짓말입니다.

다음 두 줄은 다음과 같은 말을 하려는 것이 아니기 때문에 else적어도 더 정확합니다.echo "failed"무엇실패. 그러나 이상적으로는 오류 출력이 표준 출력이 아닌 표준 오류로 전달됩니다.

else
    echo failed >&2

exit 1이 명령은 전체 스크립트를 즉시 종료하려는 경우 스크립트에서 사용하기에 적합할 수 있습니다. 대신 사용하는 것이 더 나을 수도 있지만 return 1이는 문제입니다.

더 큰 문제는전체 기능은 전혀 의미가 없습니다.

전적으로그것을 사용하는 사례는 결코 없을 것입니다.

그것은 무엇을 합니까? 그것:

  1. 사용일부(반드시 전부는 아니지만) 그 주장은,
  2. 전역 파일 확장 및 단어 분할을 수행할지 여부(모를 수도 있음),
  3. 명령으로 실행하고
  4. 다음과 같은 메시지를 인쇄하세요.거짓말일 수도 있다명령이 성공하고
  5. 명령이 실패하면 정보가 전혀 없는 "Failed" 메시지가 인쇄됩니다.

이는 유용한 기능이 아닙니다.

스크립트는 다음과 같이 단축될 수 있습니다.

mkdir -p ~/TestFolder
cp -vpR mydata ~/TestFolder/TestFile

여기에는 여전히 단점이 있는데, 그 중 하나는 홈 기반 경로( ~/TestFolder)에서 루트 기반 경로( /TestFolder)로 변환하는 것이지만 이를 수정했습니다. 더욱 낯선 선택은 TestFile이름 일 것이다목차.

하지만 이러한 측면 외에도 -v복사 명령을 실행하는 스위치에 주의하세요.긴.

또한 전역 확장이 아닌 전체 포함 디렉터리를 복사하면 쉘의 "dotglob" 옵션의 현재 설정에 관계없이 숨겨진 파일("점 파일"이라고도 함)이 복사됩니다.


올바르게 작성된 쉘 스크립트는 다음과 같습니다.매우간결하고매우강한. 바퀴를 재발명하지 마세요. 래퍼 함수를 ​​추가하기 전에 사용 중인 명령의 기능을 이해하세요.

읽어주세요울위치 카니발 가이드진지한 스크립팅을 할 계획이라면.

관련 정보