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
이는 문제입니다.
더 큰 문제는전체 기능은 전혀 의미가 없습니다.
전적으로그것을 사용하는 사례는 결코 없을 것입니다.
그것은 무엇을 합니까? 그것:
- 사용일부(반드시 전부는 아니지만) 그 주장은,
- 전역 파일 확장 및 단어 분할을 수행할지 여부(모를 수도 있음),
- 명령으로 실행하고
- 다음과 같은 메시지를 인쇄하세요.거짓말일 수도 있다명령이 성공하고
- 명령이 실패하면 정보가 전혀 없는 "Failed" 메시지가 인쇄됩니다.
이는 유용한 기능이 아닙니다.
스크립트는 다음과 같이 단축될 수 있습니다.
mkdir -p ~/TestFolder
cp -vpR mydata ~/TestFolder/TestFile
여기에는 여전히 단점이 있는데, 그 중 하나는 홈 기반 경로( ~/TestFolder
)에서 루트 기반 경로( /TestFolder
)로 변환하는 것이지만 이를 수정했습니다. 더욱 낯선 선택은 TestFile
이름 일 것이다목차.
하지만 이러한 측면 외에도 -v
복사 명령을 실행하는 스위치에 주의하세요.긴.
또한 전역 확장이 아닌 전체 포함 디렉터리를 복사하면 쉘의 "dotglob" 옵션의 현재 설정에 관계없이 숨겨진 파일("점 파일"이라고도 함)이 복사됩니다.
올바르게 작성된 쉘 스크립트는 다음과 같습니다.매우간결하고매우강한. 바퀴를 재발명하지 마세요. 래퍼 함수를 추가하기 전에 사용 중인 명령의 기능을 이해하세요.
읽어주세요울위치 카니발 가이드진지한 스크립팅을 할 계획이라면.