¿Comando que sale con estado cero (no / bin / true)?

11

Tengo un Makefile que ejecuta una herramienta que lleva un poco de tiempo; me permite reemplazar el comando utilizado:

make TOOL=alternative-tool

Me gustaría omitir ese paso en el Makefile, por lo que estoy buscando un comando que salga con el estado 0 y que tenga efectos secundarios insignificantes.

Obviamente, podría usar true, pero eso es un poco confuso:

make TOOL=true

Eso se lee como si quisiera ejecutar la herramienta, pero no lo hago.

¿Existe un ejecutable instalado por defecto que no /bin/truesalga con el estado 0 y que tenga un nombre pegadizo y fácil de escribir?

Roger Lipscombe
fuente
Makefiles admite comentarios, gnu.org/software/make/manual/html_node/Makefile-Contents.html . Pon un comentario antes de la línea y documenta tu código. Eso reduce la confusión y explica por qué usaste cierto enfoque.
Freiheit
1
¿Que linea? El TOOL=trueestará en la línea de comando cuando invoque make, probablemente documentado en un archivo README cercano. La línea real que invoca la herramienta está en algún lugar dentro de un archivo MAKE de 7000 líneas (de terceros).
Roger Lipscombe

Respuestas:

42

Aunque haya pedido algo que "no es /bin/true", la mejor solución es reemplazarlo truecon el nombre completo /bin/truepara mostrar que es el trueprograma en lugar de algún otro significado de "verdadero".

Su preocupación es que el trueen

make TOOL=true

parece ser algo más que un nombre de comando. Pero si escribes

make TOOL=/bin/true

entonces eso es inequívocamente un comando. Alguien podría interpretar mal el TOOL=truesignificado de alguna otra herramienta en algún lugar, pero no TOOL=/bin/truees probable que se lea mal .


No estoy seguro de cuándo funcionará :, que es un shell incorporado pero no un comando externo. Henning Makholm ha informado que parece funcionar . Pero creo que no funciona en todas las situaciones, y descubrió que no funcionó para usted .

En cuanto a un alias de shell, no puede usarlo porque la expansión de alias no se realiza en los argumentos que pasa a un comando, ni los archivos make hacen uso de alias de shell previamente definidos. Incluso si makeejecuta sus comandos en un nuevo shell, ese shell no tendrá el alias (y no lo usaría incluso si lo tuviera, porque sería un shell no interactivo, donde la expansión de alias no se habilita automáticamente).

Eliah Kagan
fuente
1
Usar :parece funcionar bien para mí. makesiempre genera un shell para ejecutar cada comando después de haber realizado sus propias sustituciones.
hmakholm dejó a Mónica el
@HenningMakholm Gracias, he editado. Es posible que desee publicar una respuesta. Lok Lam Cheng había comentado sobre la pregunta para sugerir :, pero debería ser una respuesta (especialmente si es correcta) y ese comentario no explica por qué uno debería esperar que funcione. En un directorio con hello.cy sin makefile, donde make hellocompila hello.ca hello, me encontré con make CC=: hellocomportado de acuerdo con lo que está diciendo.
Eliah Kagan
2
Desafortunadamente, para este Makefile en particular (usa erlang.mk ), usar :no funciona. Ser explícito sobre /bin/truees probablemente la mejor manera de hacerlo.
Roger Lipscombe
7

Si bien estoy de acuerdo en que usar la ruta completa para truesería la mejor solución, me gustaría señalar cuál es, con mucho, la forma más común de evitar la ejecución real de comandos: pegar una echodelante de ella. Entonces:

make TOOL=echo
muru
fuente
Creo que esto a veces es útil cuando es importante recordar que uno suprimió cualquier acción TOOLque de otra manera haría. Sin -so equivalente, makeemite información redundante, porque ambos makey el echocomando ejecutado por makeseparado emiten salida. Por ejemplo, cuando ejecuto make CC=echo helloen un directorio que tiene hello.cy no tiene un archivo MAKE, obtengo echo hello.c -o hellocomo la primera línea de salida y hello.c -o hellocomo la segunda. Pero algunas compilaciones usan (o el usuario puede agregar) -s, y luego es útil. make -s CC=echo helloda justo hello.c -o hello.
Eliah Kagan
(que todavía podría ser útil si los comandos shell implican expansiones, para que pueda obtener una idea más clara de lo que se ejecute, si está interesado)
Muru
5

Siempre puede hacer su propio comando que no hace nada más que devolver un estado de salida cero. Algunas opciones:

  • un enlace simbólico con nombre apropiado para /bin/true

  • un script de shell vacío

  • un programa C casi vacío:

    int main() {
        return 0;
    }
David Foerster
fuente
Un buen nombre para dicho programa sería noop o no-op.
arp
0

Cree un enlace simbólico en el directorio de trabajo a / bin / true llamado algo así skip. Así...

skip -> /bin/true

Entonces la línea de creación puede ser ...

make TOOL=./skip
DocSalvager
fuente
-2

Aquí hay una manera de hacerlo con un poco más de caracteres:

function T() { /bin/true; }

Después de haberlo hecho una vez, puede volver a ejecutarlo simplemente usando el nombre T.

false; T; echo $?
Lee B
fuente
3
¿Podría explicar cómo se puede invocar esta función desde un valor de variable Make (para ser útil en la situación en cuestión)?
David Foerster