効率性ではなく、正確さです。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##*/}。これは簡単ですが、独自のバグがあります。特に、$fileis /またはの場合は間違っていfoo/ます。