다음 스크립트는 보관 작업을 완료합니다 /home/jerzy/testdir/
.
#!/usr/bin/bash
XZ_OPT=-9 tar -cJf /home/jerzy/testdir.tar.xz -C /home/jerzy testdir && \
echo "testdir/ already archived"
그래도 다음과 같은 결과가 나옵니다.
line 3: : command not found
testdir/ already archived
XZ_OPT=-9 tar -cJf /home/jerzy/testdir.tar.xz -C /home/jerzy testdir
터미널에서 실행 하면 뱉어내지 않고 작업을 수행합니다 command not found
. 내가 받은 스크립트에서 동일한 줄이 실행될 때 왜 이런 일이 발생합니까 command not found
? 전체 경로를 지정해도 /usr/bin/tar
문제가 해결되지 않습니다.
내 환경: Ubuntu Desktop 20.04LTS, which tar
반환 /usr/bin/tar
.
답변1
tar
명령 뒤에는 &&
연속 줄이 있습니다. 아니면 오히려 계속될 것입니다.만약에그 뒤에는 공간이 없습니다 \
.
줄의 끝에는 하나 이상의 공백이 오기 때문에 \
쉘은 이를 단일 공백으로 명명된 명령으로 해석합니다. 명령을 찾을 수 없습니다.
단일 공백으로 명명된 명령 실행을 테스트합니다.
$ ' '
bash: : command not found
$ \ # an escaped space
bash: : command not found
(찾을 수 없는 명령 이름은 bash:
과 사이의 두 공백 중 두 번째 입니다 : command not found
.)
해결책은 \
백슬래시가 줄의 마지막 문자가 되도록 후행 공백을 제거하는 것입니다(개행 문자를 이스케이프 처리함).
아니면 완전히 삭제하세요 \
. 현재 스크립트에는 줄 연속이 필요하지 않습니다.
#!/bin/sh
XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir &&
echo '"testdir" archived'
스크립트에 필요한 것이 없기 때문에 /bin/sh
여기서 대신 사용하고 있습니다 . 나는 또한 사용자의 홈 디렉토리에 접근하기 위해 물결표 구문을 자유롭게 사용할 수 있었습니다 . 이렇게 하면 macOS에서와 마찬가지로 홈 디렉터리가 다른 곳에 있는 시스템에서도 스크립트를 실행할 수 있습니다. 홈디렉토리를 참조하고 싶다면bash
bash
jerzy
현재의사용자라면 저는 그것을 "$HOME"
대신 사용하겠습니다.
명령이 성공 또는 실패 echo
에 따라 결정된다는 점을 보다 명확하게 만드는 방법에는 여러 가지가 있습니다 . tar
예를 들어 다음과 같이 명령을 들여쓸 수 있습니다 echo
.
XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir &&
echo '"testdir" archived'
...또는 줄이 너무 길어지지 않는 경우 줄을 바꾸지 마세요.
XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir && echo '"testdir" archived'
if
완전한 - 문 으로 바꿀 수도 있습니다 .
if XZ_OPT=-9 tar -cJ -f ~jerzy/testdir.tar.xz -C ~jerzy testdir
then
echo '"testdir" archived'
else
exit
fi