명령은 제대로 실행되지만 bash 스크립트에서는 실행할 수 없습니다.

명령은 제대로 실행되지만 bash 스크립트에서는 실행할 수 없습니다.

아래에는 ~/Picturesjpeg를 포함하는 일부 하위 디렉터리가 있습니다(예 ~/Pictures/Pics 1/img.jpg: .

에서 bash:

~/Pictures $ `file Pics\ 1/img.jpg`   

산출:

Pics 1/img.jpg: JPEG image data, Exif standard:: [TIFF image data,
little-endian, direntries=12, description=....

내가 script.sh만들고chmod a+x

#!/bin/bash
VAR=$(builtin printf "%q" "$1")
CMD="file $VAR"
EXIF=eval "$CMD"
echo "$EXIF"
~/Pictures $ ./script.sh Pics\ 1/img.jpg

산출:

./script.sh: line 4: file Pics\ 1/img.jpg: No such file or directory

또한 img.jpg의 전체 경로를 시도하고/usr/bin/file

OS: Raspbian 업데이트/업그레이드
유사한 질문/답변을 여러 개 읽었지만 키를 얻지 못했습니다.

편집하다: 로케일 문제로 인해 (그리고 더 많은 정보가 있기 때문에) 엑시프툴을 사용할 솔루션으로 표시된 답변에 주석으로 게시했으므로 누군가 이것을 사용하는 것이 유용할 수도 있습니다 exiftool. 스크립트.sh:file

 #!/bin/bash
COMM="/usr/bin/exiftool -Description \"$1\""    
DESCR=$(eval "$COMM")    
DESCRIPTION=${DESCR#"Description                     : "}
echo "$DESCRIPTION"

메타데이터를 올바르게 출력합니다.설명하다특수문자 포함

답변1

스크립트에서 미묘하게 인용할 필요가 없습니다. 큰따옴표 $1(및 기타 변수)가 확장되었는지 확인하세요 .

#!/bin/bash

exif=$( file "$1" )
printf '%s\n' "$exif"

그렇지 않으면

#!/bin/bash

file "$1"

달리기:

./script.sh Pics\ 1/img.jpg

또는,

./script.sh "Pics 1/img.jpg"

또는,

./script.sh "Pics 1"/img.jpg

스크립트에서 일어나는 일은 \경로 이름의 일부를 생성한다는 것입니다. 이는 경로 이름의 일부가 아니며 단지 명령줄에서 공백을 이스케이프 처리하기 위한 것입니다.

또한 eval명령 실행 중에 환경 변수에 문자열을 할당할 수 있습니다. 아마 그럴 수도 있지만 필수는 아닙니다(위 참조).EXIFfileEXIF=$( eval "$CMD" )

만약 너라면진짜file전체 명령을 변수에 저장 하려면 배열을 사용해야 합니다.

#!/bin/bash

cmd=( file "$1" )
exif=$( "${cmd[@]}" )
printf '%s\n' "$exif"

다시 말하지만 여기서는 필요하지 않습니다 eval.

...이것을 작성하더라도 /bin/sh(배열은 없지만 분명히 사용 가능한 위치 인수 목록이 있습니다 bash):

#!/bin/sh

set -- file "$1"
exif=$( "$@" )
printf '%s\n' "$exif"

관련 정보