Shell-Script

命令執行正常,但不是來自 bash 腳本

  • May 24, 2019

下面~/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 更新/升級

我已經閱讀了幾個類似的問題/答案,但沒有得到密鑰

編輯: 也許有人使用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"

引用自:https://unix.stackexchange.com/questions/520416