命令运行正常,但无法从 bash 脚本运行

命令运行正常,但无法从 bash 脚本运行

下面~/Pictures有一些包含 jpeg 的子目录,例如 ~/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.shchmod 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

操作系统:Raspbian 更新/升级
我已经阅读了几个类似的问题/答案,但没有得到密钥

编辑: 也许对某人来说使用它会很有用exiftoolfile
因为我在标记为解决方案的答案中以评论形式发布了由于区域设置问题(并且因为我获得了更多信息),所以我将使用 exiftool。
脚本.sh:

 #!/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"

相关内容