Вы не дали нам почти никакой информации, чтобы продолжить.Тем не менее, вам повезло!
В Mac OS X bash был собран с --enable-strict-posix-default
, и поэтому опция оболочки xpg_echo
по умолчанию включена в режиме POSIX.Режим POSIX включается, когда оболочка вызывается как /bin/sh
, как это было, когда она вызывается командой Make, если вы не указали это иначе, установив переменную $(SHELL)
make (что, вероятно, не следует).
В этом разница между Linux и Mac OS, которая убивает ваш make-файл.Когда xpg_echo
включен, встроенная в оболочку echo
обрабатывает -n
как еще один аргумент, который должен быть напечатан (и, следовательно, также печатает новую строку).Таким образом, один аргумент classpath, который вы пытаетесь создать, заканчивается как набор отдельных аргументов (половина из которых - "-n"), и javac запутывается.
(Это не происходит в командедаже в Mac OS X, потому что тогда оболочка была вызвана как /bin/bash
, поэтому она не находится в режиме POSIX, а xpg_echo
выключен.)
Таким образом, у вас есть несколько вариантов исправления:
Используйте /bin/echo -n
в своем фрагменте оболочки;в отличие от встроенной, настоящая команда echo в наши дни в большинстве случаев всегда понимает -n
;
Создайте аргумент classpath менее округлым способом, чем ваша оболочка для цикла;например,
... -classpath `ls Classes/jars/* | tr '\n' :` ...
или, если вы уже используете GNU Make, использование подстановочных знаков и функций make вместо фрагмента оболочки;
Пусть ваш коллега добавит shopt -u xpg_echo
к соответствующему файлу запуска bash на их машине (однако это приведет к путанице в будущем, когда придет ваш следующий коллега, использующий Mac OS, и вы уже давно забыли, как вы исправили это на этот раз).
Наконец, общее замечание об отладке make-файлов: когда команда javac ...
в рецепте make-файла выдает непонятные сообщения об ошибках, измените ее на echo javac ...
.Тогда вы сможете увидеть точно , как он вызывается - что, как видно здесь, может не совпадать с тем, что вы намеревались.