Это очевидно для целей других гуглеров, таких как я, а не ОП, видя, что прошло более 5 лет. Но это решение существовало и тогда.
Вы можете попробовать замену bash, чтобы убрать самый большой шаблон из конца строки, который выглядит как $ {varname %% pattern}, подробнее здесь:
http://tldp.org/LDP/abs/html/string-manipulation.html
Это должно быть быстрее, чем порождать другой процесс, такой как tr, для его обработки.
VARNAME=$'a_bad_filename\r'
VARNAME="${VARNAME%%[[:cntrl:]]}"
Вот ссылка на строго ограниченное сопоставление с шаблоном bash (на самом деле это не регулярное выражение, а скорее выражение "like" или "glob"). Что касается того, почему возврат каретки находится в классе управления, а не в классе пробелов, я не уверен. Это считается пробелом в других языках. Без включения расширенного сопоставления с образцом с помощью «shopt -s extglob», нет никакого способа указать простую конструкцию, например, "этот символ повторяется 0 или более раз" в bash. Я также нашел
printf "%q" "${VARNAME}"
.. в дополнение к "set -vx", чтобы показать / проверить возврат каретки.
Я сталкивался с этой проблемой при использовании Cygwin Bash против вывода из стандартной (не Cygwin) версии Python; Я не понимаю, почему я не вижу больше о том, как это решить.