Чтобы объяснить проблему, которую вы видите, это происходит во второй команде sed
:
sed -e 's/\//\\/g'
make
использует \
в качестве специального символа, который можно использовать для экранирования %
, поэтому \\
— это escape-последовательность, которая преобразуется в\
(одиночную обратную косую черту.)
За исключением двух обратных косых черт подряд или после %
, обратная косая черта сохраняется дословно, поэтому \/
сохраняется как \/
и не вызывает никаких проблем (, поэтому только это место вызывало беда.)
Таким образом, команда sed
, которая фактически выполняется, это:
sed -e 's/\//\/g'
Если вы используете другой разделитель, например #
:
, эта команда выглядит незавершенной.
sed -e 's#/#/g'
Во-первых, конечный разделитель (в данном случае#
)отсутствует. Кроме того, замена получает /
, а не \
, как предполагалось.
Вы можете исправить это, добавив дополнительную обратную косую черту (или две тоже подойдут):
sed -e 's/\//\\\/g'
Но кому-то, кто читает этот код, это может показаться довольно странным, поэтому я рекомендую добавить комментарий, объясняющий, что происходит.
Другой хорошей идеей было бы удваивать каждый обратный слэш, чтобы было ясно, что make
использует один их уровень в качестве управляющей последовательности:
sed -e 's/\\//\\\\/g'
Тьфу, все еще довольно ужасно... Использование разделителя, отличного от #
, может немного помочь, но вряд ли настолько:
sed -e 's#/#\\\\#g'
В конкретном случае, который вы используете здесь sed
, то есть для преобразования пути Cygwin в путь Windows, вы можете использовать cygpath --windows
, как указано @HaiVu в комментариях.
Вы можете использовать услуги ipinfo.io или ipstack.com черезcurl
:curl --silent "https://ipinfo.io/ip"
аналогичным образом измените ip
на country
, чтобы получить свое географическое положение.