스크립트에서 tar를 실행할 때 "명령을 찾을 수 없음" 메시지가 나타나는 이유는 무엇입니까(실행 시 터미널에서 그러한 출력을 제공하지 않음)?

스크립트에서 tar를 실행할 때 "명령을 찾을 수 없음" 메시지가 나타나는 이유는 무엇입니까(실행 시 터미널에서 그러한 출력을 제공하지 않음)?

다음 스크립트는 보관 작업을 완료합니다 /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에서와 마찬가지로 홈 디렉터리가 다른 곳에 있는 시스템에서도 스크립트를 실행할 수 있습니다. 홈디렉토리를 참조하고 싶다면bashbashjerzy현재의사용자라면 저는 그것을 "$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

관련 정보