![도트 파일을 포함할 때 tar 오류가 발생함](https://linux55.com/image/169643/%EB%8F%84%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%ED%8F%AC%ED%95%A8%ED%95%A0%20%EB%95%8C%20tar%20%EC%98%A4%EB%A5%98%EA%B0%80%20%EB%B0%9C%EC%83%9D%ED%95%A8.png)
일부 파일을 압축해야 하는데 그 중 하나가 도트 파일입니다.
FILE1=/tmp/foo/.env
FILE2=/tmp/foo/docker-compose.yml
FILES="${FILE1#/} ${FILE2#/}"
tar -C / -cf /tmp/foo/files.tar "$FILES"
변수 대체는 tar: Removing leading '/' from member names
경고를 방지하고 압축 풀기 프로세스를 단순화합니다.
하지만 다음 오류가 발생합니다.
tar: tmp/foo/.env tmp/foo/docker-compose.yml: 계산할 수 없음: 해당 파일이나 디렉터리가 없습니다.
하드코딩된 경로는 유효합니다: tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml
.
그렇다면 문제는 도트 파일을 처리하는 데 있는 것인가요, 아니면 이스케이프와 관련이 있는 것인가요?
답변1
쉘이 확장되면 "$FILES"
공백은 문법적 가치를 잃습니다. 따라서 명령은 tar
단일 경로로 수신됩니다.tmp/foo/.env tmp/foo/docker-compose.yml
좋다
file='a b'
touch "$file"
a b
두 개의 파일 대신 파일을 생성 a
하고 b
.
따라서 주석에서 제안한 대로 파일마다 다른 변수를 사용해야 합니다 tar -C / -cf /tmp/foo/files.tar "${FILE1#/}" "${FILE2#/}"
.
직접 실행하면 작동하는 이유 tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml
는 공백이 하나의 매개변수를 다른 매개변수와 구분하는 구문적 값을 갖기 때문입니다. "사람의 눈"에는 "$FILES"
확장 시 동일한 공간이 생성되지만 tmp/foo/.env tmp/foo/docker-compose.yml
이 경우 공간은 참조로 인해 특별한 의미가 없으므로 전체 값이 단일 경로로 간주됩니다.