Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

275
Views
Capture el error estándar de Shell en el archivo MAKE

Tengo un problema con la función de shell en los archivos MAKE. Haciendo esto:

 var := $(shell some-command)

Me permite capturar la stdout de some-command .

Haciendo esto:

 var := $(shell some-command 2>&1)

Me permite capturar el stdout y el stderr de some-command .

¿Cómo capturo el stderr del propio shell?

Este archivo MAKE ilustra el problema:

 var1 := $(shell date 2>&1) var2 := $(shell ls aaa 2>&1) var3 := $(shell a-command-which-does-not-exist 2>&1) show-me: @echo var1: \"$(var1)\" @echo var2: \"$(var2)\" @echo var3: \"$(var3)\"

Producirá:

 /bin/sh: 1: a-command-which-does-not-exist: not found var1: "So 6. Feb 00:37:05 CET 2022" var2: "ls: cannot access aaa: No such file or directory" var3: ""

Me gustaría capturar /bin/sh: 1: a-command-which-does-not-exist: not found into var3 . es posible?

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Tienes que ejecutarlo en una subcapa:

 var3 := $(shell $(SHELL) -c 'a-command-which-does-not-exist' 2>&1)

Lamentablemente, no hay otra manera.

ETA OK, lo descubrí. El problema es que si el shell invocado por la función $(shell ...) sale con un código de error de 127 (que es el código de salida del shell para cuando no puede encontrar un programa para ejecutar), entonces GNU make explícitamente escribe su salida en stderr en lugar de capturarla (si examinas la function.c:func_shell_base() verás esto).

Cualquier cambio en el shell que invoques que asegure que no salga con el código de salida 127 "solucionará" el problema:

 $ cat Makefile out := $(shell bad-program 2>&1 || exit 1) $(info out = $out) $ make out = /bin/sh: 1: bad-program: not found make: *** No targets. Stop.

Esto podría ser un error en la creación de GNU. Tendré que considerarlo.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!