효율성에 관한 것이 아니라 정확성에 관한 것입니다. basename
줄 바꿈을 사용하여 인쇄 할 파일 이름을 구분합니다. 일반적인 경우 하나의 파일 이름 만 전달하면 출력에 후행 줄 바꿈이 추가됩니다. 파일 이름에는 개행 문자가 포함될 수 있으므로 이러한 파일 이름을 올바르게 처리하기가 어렵습니다.
사람들이 일반적으로 다음 basename
과 같이 사용한다는 사실로 인해 더 복잡합니다 "$(basename "$file")"
. 모든 후행 줄 바꿈을에서 $(command)
제거 하기 때문에 상황이 더욱 어려워 집니다 . 줄 바꿈으로 끝나는 경우를 고려하십시오 . 그런 다음 줄 바꿈을 추가하지만 두 줄 바꿈을 모두 제거 하면 파일 이름이 잘못됩니다.command
$file
basename
"$(basename "$file")"
또 다른 문제는 basename
경우이다 $file
로 시작할 -
(마이너스 일명 대시)가 옵션으로 해석됩니다. 이것은 쉽게 고칠 수 있습니다.$(basename -- "$file")
강력한 사용법 basename
은 다음과 같습니다.
# A file with three trailing newlines.
file=$'/tmp/evil\n\n\n'
# Add an 'x' so we can tell where $file's newlines end and basename's begin.
file_x="$(basename -- "$file"; printf x)"
# Strip off two trailing characters: the 'x' added by us and the newline added by basename.
base="${file_x%??}"
대안은을 사용 ${file##*/}
하는 것인데, 더 쉽지만 자체 버그가 있습니다. 특히 $file
is /
또는 인 경우에는 잘못되었습니다 foo/
.