効率性ではなく、正確さです。basename
改行を使用して、出力するファイル名を区切ります。通常、ファイル名を1つだけ渡す場合、出力に末尾の改行が追加されます。ファイル名には改行自体が含まれている場合があるため、これらのファイル名を正しく処理することは困難です。
人々が通常次のbasename
ように使用するという事実により、さらに複雑になります"$(basename "$file")"
。これにより、後続の改行$(command)
をすべてから削除するため、事態はさらに困難になりcommand
ます。$file
改行で終わるありそうもないケースを考えてみましょう。その後basename
、余分な改行を追加しますが、両方の改行"$(basename "$file")"
を削除し、誤ったファイル名を残します。
もう1つの問題は、a (ダッシュ、別名)で始まるbasename
場合、オプションとして解釈されることです。これは簡単に修正できます。$file
-
$(basename -- "$file")
堅牢な使用方法basename
は次のとおりです。
# A file with three trailing newlines.
file=$'/tmp/evil\n\n\n'
# Add an 'x' so we can tell where $file's newlines end and basename's begin.
file_x="$(basename -- "$file"; printf x)"
# Strip off two trailing characters: the 'x' added by us and the newline added by basename.
base="${file_x%??}"
別の方法はを使用することです${file##*/}
。これは簡単ですが、独自のバグがあります。特に、$file
is /
またはの場合は間違っていfoo/
ます。