El paso a paso o código que encontrarás en este post es la resolución más eficiente y efectiva que hallamos a tus dudas o dilema.
Solución:
Quiero capturar esa salida en una variable y luego imprimir la variable en un archivo.
No parece haber una forma de evitar make
El mecanismo de para traducir saltos de línea en la salida del comando de shell a espacios. Un poco de un truco que se mantiene cerca de su enfoque original sería hacer que el shell convierta las nuevas líneas en algún carácter poco común (como 1
) al asignar la salida a la variable y luego hacer que la traduzca de nuevo cuando echo
-ing esa variable al archivo. Algo como esto:
OUTPUT=$(shell cowsay hello | tr 'n' '1')
all:
@echo "$(OUTPUT)" | tr '1' 'n' > output.txt
Para mí, esto resulta en
$ make
$ cat output.txt
_______
< hello >
-------
^__^
(oo)_______
(__) )/
||----w |
|| ||
Esta es una respuesta negativa, desafortunadamente. El GNU Make Manual establece (énfasis añadido):
los
shell
función realiza la misma función que realizan las comillas inversas en la mayoría de los shells: no expansión de comando. Esto significa que toma como argumento un comando de shell y evalúa la salida del comando. El único procesamientomake
hace en el resultado es convertir cada nueva línea (o retorno de carro / par de nueva línea) en un solo espacio. Si hay una nueva línea final (retorno de carro y) simplemente se eliminará.
no creo que eval
o define
ayudará.
La única solución alternativa que puedo ver es almacenar el cowsay hello
dominio en una variable, en lugar de la salida del comando, como en:
OUTPUT=$$(seq 5) # seq 5 replaces cowsay hello
all:
@echo "$(OUTPUT)" > output.txt
Esta solución es mala si cowsay hello
es caro de calcular o tiene efectos secundarios. Una segunda solución es mantener su salida, pero reemplazar los saltos de línea con cualquier carácter arbitrario, usando por ejemplo sed
, y luego agregar los saltos de línea nuevamente. Por ejemplo:
OUTPUT=$(shell seq 5 | sed s/$$/xxx/) # add xxx to the end of each line
all:
@echo -n $(OUTPUT) ' ' | sed 's/xxx /n/g' # replace xxx-space with line break
Aquí tienes las comentarios y calificaciones
Nos puedes asistir nuestro ensayo ejecutando un comentario o valorándolo te damos la bienvenida.