Повторное использование базового имени имеет огромный удар по производительности. Он маленький и незаметный, когда вы делаете это над файлом или двумя, но складывает более сотни из них. Позвольте мне сделать несколько временных тестов, чтобы вы продемонстрировали, почему использование basneame (или любого вызова системной утилиты) плохо, когда внутренняя функция может выполнить эту работу - Деннис и ghostdog74 дали вам более опытные ответы BASH.
Пример входных файлов files.txt (список моих фото с полным путем): 3749 записи
external.sh
while read -r line
do
line=`basename "${line}"`
echo "${line%\"}"
done < "files.txt"
internal.sh
while read -r line
do
line=${line##*/}
echo "${line%\"}"
done < "files.txt"
Результаты по времени, перенаправляя вывод в / dev / null, чтобы избавиться от задержки видео:
$ time sh external.sh 1>/dev/null
real 0m4.135s
user 0m1.142s
sys 0m2.308s
$ time sh internal.sh 1>/dev/null
real 0m0.413s
user 0m0.357s
sys 0m0.021s
Вывод обоих идентичен:
$ sh external.sh | sort > result1.txt
$ sh internal.sh | sort > result2.txt
$ diff -uN result1.txt result2.txt
Итак, как вы можете видеть из временных тестов, вы действительно хотите избежать любых внешних вызовов системных утилит, когда вы можете написать ту же функцию в каком-нибудь творческом коде BASH / жаргоне, чтобы выполнить работу, особенно когда она будет вызвана много раз снова и снова.