Unix에서 마침표가 있는 파일을 허용하는 이유는 무엇입니까?마지막에이름? 이것이 유용합니까?
예를 들어:
filename.
파일 확장자를 에코하는 간단한 기능이 있기 때문에 이것을 묻습니다.
ext() {
echo ${1##*.}
}
그러나 파일 이름이 로 끝나면 아무것도 인쇄되지 않는다는 것을 알고 있으므로 .
다음과 같이 작성하는 것이 더 신뢰할 수 있을지 궁금합니다.
ext() {
extension=${1##*.}
if [ -z "$extension" ]; then
echo "$1"
else
echo "$extension"
fi
}
분명히 달성하려는 작업에 따라 다르지만 .
파일 이름 끝에 추가하는 것이 허용되지 않으면 애초에 그것에 대해 아무것도 알고 싶지 않을 것입니다.
답변1
유닉스 파일 이름단지 일련의 바이트이며 /
모든 위치에서 합계를 제외한 모든 바이트를 포함할 수 있습니다. NUL
Windows 및 해당 파일 시스템과 같은 내장된 "확장자" 개념이 없으므로 파일 이름이 일반적으로 나타날 수 있는 문자로 끝나거나 시작하는 것을 허용하지 않을 이유가 .
없습니다 x
.
Unix에서 파일 이름 끝에 마침표를 허용하는 이유는 무엇입니까? "바이트 시퀀스"는 무언가를 계산해야 하는 동기 부여 이유가 없을 때 실제로 계산할 이유가 없는 경우에 대한 간단하고 비배타적인 이름 정의입니다. 특정 콘텐츠를 구체적으로 제외하는 규칙을 개발하고 적용하려면 더 많은 작업이 필요합니다.
어떤 목적으로 사용됩니까? 물론 해당 이름으로 파일을 생성할 수 있습니다. 로 끝나는 파일 이름을 사용할 수 있나요 x
? 일반적 .
으로 a로 끝나는 파일 이름 을 생성한다고 말할 수는 없지만 둘 다 및 분명히 다음의 일부 .
입니다 .x
이식 가능한 파일 이름 문자 집합이는 보편적으로 지원되어야 하며 어느 쪽에도 특별한 것이 없으므로 이를 사용해야 하는 경우(아마도 기계 생성 인코딩을 사용하여) 그렇게 할 수 있고 작동한다고 믿을 수 있습니다.
.
또한 현재 디렉터리와 상위 디렉터리를 참조하는 특수 파일 이름 (점) 및 (점-점)은 다음과 같습니다...
필수적인파일 이름을 처리하는 모든 코드는 일반적 으로 .
이러한 문제를 해결해야 합니다.
답변2
실제 질문은 왜 운영 체제가 "."를 중요하게 생각하는지입니다. ? 이렇게 하는 데는 기술적인 이유가 없으며, 확인하지 않고 파일 형식을 가정하는 데 도움이 되는 표준일 뿐입니다.
MP3 파일의 이름을 .txt로 바꾸고 Windows에서 열려고 하면 이 아이디어에 단점이 있는 이유를 즉시 이해하게 될 것입니다. 갑자기 파일을 올바르게 "열 수 없습니다". 기술적으로 속도와 같은 요소를 고려하지 않고 "최상의" 접근 방식은 파일로 무엇을 할지 결정하기 전에 파일 형식을 결정하는 것입니다. 확장자는 쉽게 엉망이 될 수 있고 문제를 일으킬 수 있기 때문입니다.
리눅스가 이름의 마침표를 신경 쓰지 않는 이유는 컴퓨터가 아닌 사람들이 신경 쓰지 않는 것과 같은 이유입니다. 마침표와 다른 문자 사이에는 본질적인 차이가 없습니다. 단, 일부 프로그램은 해당 마침표를 보도록 코딩되어 있습니다. 그리고 그것을 특별히 대접하라.
실제로 확장 기능만 원한다고 가정하면(두 코드 조각의 기능이 아님) 다음을 사용할 수 있습니다.
ext(){
extension=
[[ $1 =~ \. ]] && extension="${1##*.}"
echo "$1 -> ${extension:-No extension}"
}
ext something. # something. -> No extension
ext something.txt # something.txt -> txt
ext something # something -> No extension
ext som.thing.mp3 # som.thing.mp3 -> mp3
ext .whatever # .whatever -> whatever
*마지막 내용을 참고하세요.
확장자가 없을 때(코드처럼) 파일 이름 자체를 반환하려는 경우 긴 SH 스타일의 두 번째 조각을 사용할 이유가 없습니다. 당신은 다음과 같이 썼습니다:
ext() {
extension=${1##*.}
if [ -z "$extension" ]; then
echo "$1"
else
echo "$extension"
fi
}
이것은 실제로 다음과 같습니다.
ext(){
extension="${1##*.}"
# This line is what your first snippet is doing:
# echo "$extension"
# This line is what your second snippet is doing:
[[ $extension ]] && echo "$extension" || echo "$1"
}
이것은 실제로 다음과 같습니다.
# First snippet
ext(){
echo "${1##*.}"
}
# Second snippet
ext(){
extension="${1##*.}"
echo "${extension:-$1}"
}
사용자가 기본적으로 무엇이든 입력할 수 있다는 사실을 당연하게 여길 수는 없습니다. 실제로 어떤 파일 형식인지 확인하려면 file 명령을 사용해 보세요. 파일 형식을 알아내기 위해 파일 이름을 구문 분석하는 것이 스킨을 적용하는 유일한 방법은 아니기 때문입니다. Linux에서는 간단한 파일 이름을 사용할 수도 있습니다.\