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 basename
bö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 $file
bir satırla sona eren olası olmayan durumu düşünün . Sonra basename
ekstra yeni satır eklemek, ancak "$(basename "$file")"
şerit olacak hem yanlış dosya ile ayrılırken, yeni satır.
Diğer bir problem basename
ise (tire eksi $file
ile 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ış $file
olduğunu /
veya foo/
.