このようなことをするのは悪い考えであることはよく知られています。<command> $FILENAME
たとえば-<option>
、<command>
その-<option>
ファイルディスカッション、<command>
次のように実行されます。オプション -<option>
。
それでは、これを達成するための普遍的で安全な方法はありますか? 1つの前提はfilenameの前に追加することですが、--
これが100%安全であるかどうかはわかりません。このオプションがないコマンドがあるかもしれません。
答え1
まず、常に二重引用符で変数を囲みます(このルールには例外がありますが、時が来たら簡単に理解できます)。空白文字を含むファイル名のリスクは、マイナス記号で始まるファイル名よりも高くなります(おそらく高い)。
したがって、最初のコマンドは次のようになります。
<command> "$FILENAME"
以下は-<option>
ケースです。問題を見事にまとめました。使用は--
問題--
ありませんが、すべてのコマンドがこの構文をサポートしていないため、盲目的にコマンドに追加することはできません。
./file
マイナス記号(またはその他の機密文字)で始まるファイル名を含む変数を防ぐ完全に安全な方法は、ファイル名の前に相対パス()または絶対パス()が続くように変更することです/foo/bar/file
。これにより、最初の文字はまたはそのため.
無害になります/
。
$filename
このコードは、すでに絶対パスではない限り、相対パスを追加します。
[[ "$filename" != /* ]] && filename="./$filename"
個人的には、シェルスクリプトでファイルパラメータを標準表現(フルパス)に変更することを好みます。
filename="$(readlink -f -- "$filename")"
または:
filename="$(realpath -m -- "$filename")"
(どのようなものを使うべきかを知りたい場合は、以下を参照してくださいrealpath
。readlink
この素晴らしい答え)