Shell-Script
命令執行正常,但不是來自 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.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
作業系統:Raspbian 更新/升級
我已經閱讀了幾個類似的問題/答案,但沒有得到密鑰
編輯: 也許有人使用
exiftool
而不是file
因為語言環境問題我在標記為解決方案的答案中作為評論發布(並且因為我得到更多資訊)我將使用exiftool。
腳本.sh:
#!/bin/bash COMM="/usr/bin/exiftool -Description \"$1\"" DESCR=$(eval "$COMM") DESCRIPTION=${DESCR#"Description : "} echo "$DESCRIPTION"
它正確輸出帶有特殊字元的元數據描述
沒有必要在腳本中巧妙地引用。只要確保你雙引號
$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
給環境變數。您可能的意思是,但這不是必需的(見上文)。EXIF``file``EXIF=$( 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"