Это происходит потому, что ваш global.sh
имеет формат файла DOS, который кодирует конец строки как возврат каретки, за которым следует символ новой строки.
Linux/Unix будет рассматривать только символ новой строки как новую строку, поэтому возврат каретки станет частью содержимого переменной ${CODE_DIR}
.
Когда вы повторяете символ возврата каретки, курсор возвращается к началу строки. Вот что происходит в этом случае: сначала печатается /app001/Documents/files//code
из ${CODE_DIR}
, затем возврат каретки в конце этой переменной переместит курсор обратно в начало строки, а затем часть /SOMETHING
перезапишет начало строки.
Вы можете визуализировать это, направив вывод через cat -v
, который будет отображать все символы, а возврат каретки будет отображаться как^M
:
$./index.sh | cat -v
/app001/Documents/files//code^M/SOMETHING
Чтобы исправить это, преобразуйте новые строки в global.sh
в формат Unix, что вы можете сделать с помощью инструмента dos2unix
, если он доступен на вашем компьютере.
$ dos2unix global.sh
Или откройте файл в Vim и конвертируйте его там:
$ vim global.sh
:set ff=dos
:wq
Вы можете проверить другие файлы (, такие как index.sh
), на наличие окончаний строк DOS. Вы также можете проверить, почему global.sh
оказался с окончаниями файлов DOS, и исправить это. Если вы используете текстовый редактор для создания этих файлов, убедитесь, что текстовый редактор правильно настроен, чтобы всегда использовать окончания строк Unix.
$ awk -v base='/mnt/data_' 'sub(base,"") && ($1>max){max=$1} END{print base max+1}' file
/mnt/data_4