
일부 파일은 도트파일로 tar해야 합니다.
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: stat: 해당 파일이나 디렉터리가 없습니다.
경로 하드코딩이 작동합니다: 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
, 이 경우에는 인용으로 인해 공간이 특별한 의미가 없으므로 전체 값이 하나의 경로로 간주됩니다.