コマンドは正しく実行されますが、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アップデート/アップグレード
同様の質問/回答を複数読んだが、キーを取得できませんでした。

編集する: ロケールの問題のために(そしてより多くの情報があるため)、exciptoolを使用するソリューションとしてマークされた答えにコメントとして投稿したので、誰かがこれを使用するのが役に立つかもしれません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"

おすすめ記事