Bu verimlilikle ilgili değil - doğrulukla ilgili. basenameÇıktılan dosya adlarını sınırlamak için newlines kullanır. Her zamanki dosyada yalnızca bir dosya adı geçtiğinde, çıktısına sonunda yeni bir satır ekler. Dosya adları yeni satırlar içerebildiğinden, bu dosya adlarının doğru bir şekilde ele alınmasını zorlaştırır.
Ayrıca insanlar genellikle kullandıkları yüzünden karmaşık bir hale basenameböyle: "$(basename "$file")". Bunun nedeni, işler daha da zor hale getirir $(command)şeritler tüm sondaki yeni satırların arasından command. Yeni $filebir satırla sona eren olası olmayan durumu düşünün . Sonra basenameekstra yeni satır eklemek, ancak "$(basename "$file")"şerit olacak hem yanlış dosya ile ayrılırken, yeni satır.
Diğer bir problem basenameise (tire eksi $fileile başlar -), bir seçenek olarak yorumlanacağıdır. Bunu düzeltmek kolaydır:$(basename -- "$file")
Kullanmanın sağlam yolu basenameşudur:
# 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%??}"
Bunun bir alternatifi, ${file##*/}daha kolay fakat kendine has böcekleri olan bir kullanımdır. Özellikle, vakalarda yanlış $fileolduğunu /veya foo/.