Команда Bash перестала работать после добавления встроенного комментария

Присвоение нового значения, сгенерированного в подоболочке, работает без завершающего комментария:

newname=$(echo "$newname" | sed 's@TD.'"$oldnewTD"'@TD.r'"$ftd1"'@')

Но переменная newname остается неизменной, если добавляется завершающий комментарий:

newname=$(echo "$newname" | sed 's@TD.'"$oldnewTD"'@TD.r'"$ftd1"'@')# let us not change NonEqRead to NonEq

Почему?

Баш версии 5.0.3.


person Esmu Igors    schedule 11.08.2020    source источник


Ответы (1)


Оказалось, что пробел ПЕРЕД решеткой чрезвычайно важен в bash — об этом не часто упоминают, потому что это кажется слишком очевидным из-за ухудшения читабельности. Однако, когда вы используете подсветку синтаксиса, легко пропустить этот пробел, не заметив его (конечно, проблема, зависящая от редактора; например, затронута vim). Я потратил хорошее время, пытаясь понять, где была ошибка.

newname=$(echo "$newname" | sed 's@TD.'"$oldnewTD"'@TD.r'"$ftd1"'@') # let us not change NonEqRead to NonEq

Без пробела вся строка молча завершает работу (т. е. без какого-либо сообщения об ошибке). Насколько я понимаю, bash пытается интерпретировать хеш как некий модификатор подоболочки или оператора присваивания. В любом случае, похоже, это связано с тем, как bash-скрипты читаются слово за словом.

См. объяснение связанного случая: https://stackoverflow.com/a/60238806/2010413

person Esmu Igors    schedule 11.08.2020
comment
Из gnu.org/software/bash/manual/bash.html#Comments, a word beginning with ‘#’ causes that word and all remaining characters on that line to be ignored Если у вас нет пробела, # не будет начинать слово, а будет частью последнего слова, возвращаемого подоболочкой. - person Philippe; 11.08.2020