update pinturas nanorc mac color makefile bash

makefile - nanorc - pinturas nano colors



Cómo usar sed en un makefile (6)

He intentado poner lo siguiente en mi Makefile:

@if [ $(DEMO) -eq 0 ]; then / cat sys.conf | sed -e "s#^public_demo[/s=].*$#public_demo=0#" >sys.conf.temp; / else / cat sys.conf | sed -e "s#^public_demo[/s=].*$#public_demo=1#" >sys.conf.temp; / fi

pero cuando ejecuto make , me sale el siguiente error:

sed: -e expression #1, char 30: unterminated `s'' command

Si ejecuto las líneas exactas que contienen sed en la consola, se comportan correctamente.

¿Por qué recibo este error y cómo se puede solucionar el problema?


Intenté el signo doble $$ pero no funcionó en mi problema, tal vez $$$$ o $$$$$$$$ habría funcionado, porque mi Makefile llama a otros Makefiles y así sucesivamente. Pero encontré una mejor solución:

Cree un archivo de shell replacer.sh en la misma carpeta que su Makefile que ejecuta el comando sed . Dale bit ejecutable con

chmod +x replacer.sh

Ahora puedes llamar a este archivo en tu Makefile:

./replacer.sh


La versión make en mi máquina es:

$ make --version GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program built for x86_64-redhat-linux-gnu

Y la versión sed :

$ sed --version GNU sed version 4.2.1

Debo agregar barra invertida por $ para evitar que lo tome como final de línea:

cat sys.conf | sed -e ''s#^public_demo[/s=].*/$$#public_demo=0#'' >sys.conf.temp


Le sugiero que use comillas simples en lugar de comillas dobles, el $ podría procesarse como un carácter especial por marca antes de ejecutar sed:

cat sys.conf | sed -e ''s#^public_demo[/s=].*$#public_demo=0#'' >sys.conf.temp;


Puede ser el signo $ en la sustitución que se interpreta por hacer como una variable. Intenta usar dos de ellos como . * $$ # public_demo . Entonces make lo expandirá a un solo $.

EDIT: Esto fue sólo la mitad de la respuesta. Como respondió cristis: la otra parte es que uno necesita usar comillas simples para evitar que bash también expanda el signo $.


Un problema que tuve con el uso de sed en un makefile no se aborda con las respuestas actuales, así que lo explicaré aquí. Estaba poblando las variables de Bash así: remote_owner=$$($(MAKE) remote.owner) y luego remote_owner=$$($(MAKE) remote.owner) esas variables en mi sustitución sed. El problema es que, debido a la forma complicada en que están configuradas mis reglas, remote_owner podría tener una salida propia de make, dándome el error:

sed: -e expression #1, char 69: unknown option to `s'' make: *** [alter_table_local.sql] Error 1

por ejemplo, al agregar mensajes de depuración, encontré local_owner configurado en:

make[1]: Entering directory `/home/jcomeau/rentacoder/jh'' jcomeau

la respuesta fue agregar la opción --silent para hacer: remote_owner=$$($(MAKE) --silent remote.owner)


Use algo más que # para separar las partes.