web-dev-qa-db-ja.com

bashスクリプトで(渡された)変数にcdできない

私はbashを使用して、大胆な情報から表示用の不快な情報(アルバムアートを含む)を取得しています。私は大胆不敵から音楽ファイルのディレクトリへのパスを取得し、そのディレクトリにcdしてfolder.jpgを見つけようとします-見つかった場合は、表示の準備をします。残念ながら、「整形式」のパス名に依存することはできません。それらのどれも端末からの問題はありませんが、bashが行う評価は...現在の設定で処理されているようですが、ダブルスペース() '/とおそらく他のもので窒息します-わかりました。関連する関数は次のとおりです。

GetArt ()
{
    file_path=`audtool --current-song-Tuple-data file-path` # get the path to the song
    file_path=$(eval echo "${file_path}")                   # pre-expand to full path
    cd "${file_path}"
    if [[ ! -e "folder.jpg" ]];                             # if no art work found
    then
        cp ~/Work/vinyl.png /tmp/cover.png              # put in placeholder
    else
        convert "${file_path}""/folder.jpg" -resize 120x120 /tmp/cover.png # ready for showing
    fi
}

任意のアイデア、またはワイヤーブラシを取り出し、Rustを 'C'コンパイラから削除する方が簡単でしょうか?

私は二重引用符、単一引用符、バッククォート、さらには次のような構成で試しました:

code=$code \"\$filename\""

しかし、まだ何も正しく動作していないようです。幸い、代わりに「アートが見つかりません」という代替画像が表示されるため、「かなり」失敗しますが、次の曲またはアルバムまでstderr全体でげっぷが発生することがあります。

4
freebird54

_file_path_変数の再割り当ては必要ありません。発生する可能性のある2つの兆候があり、スクリプトが壊れる可能性があります。

  1. audtoolがエラーを返すため、変数は空です
  2. audtoolsは、空白を含むディレクトリを返します。
  3. audtoolには、ホームディレクトリの_~_が含まれます

ここでは、これらの問題に対処する方法に関する提案を示します。

_GetArt ()
{
    file_path="$(audtool --current-song-Tuple-data file-path)"
    file_path="$(readlink -f "$(bash -c "echo $file_path")")"
    if [[ ! -d $file_path ]]; then
        echo "error: $file_path does not exists"
        exit 1
    fi
    folder_jpg="$file_path/folder.jpg"
    if [[ ! -e "$folder_jpg" ]]; then
        cp ~/Work/vinyl.png /tmp/cover.png
    else
        convert "$folder_jpg" -resize 120x120 /tmp/cover.png
    fi
}
_

"$(command)"は、フォルダ名の空白(存在する場合)を処理します。不要な場合は、スクリプト内でcdを使用しないでください。返された文字列がディレクトリかどうかを確認することは常に良い考えです。ほとんどの場合、絶対パスを使用する方が適切であり、間違ったフォルダでコマンドが実行されるのを防ぎます。

Bashの_~_展開に関する注記:

_~_の展開はbashによって処理されるため、ここでは_readlink -f_は役に立ちません。したがって、_~_を含む変数は、展開するために引用符で囲まずに実行する必要があります(スクリプトを更新しました)。もちろん、これは1行で処理できます...

_# expansion from current bash
$ set -x; readlink -f ~; set +x
+ readlink -f /home/user
/home/user
+ set +x

# expansion will not work, with quoted ~
$ set -x; readlink -f '~'; set +x
+ readlink -f '~'
/home/user/~
+ set +x

# expansion from un-quoted ~ with sub-Shell
$ set -x; readlink -f "$(bash -c "echo ~")"; set +x
++ bash -c 'echo ~'
+ readlink -f /home/user
/home/user
+ set +x
_
0
Simon Sudler