stdin, stdout y stderr

Imagen de ndante

Forums: 

¿Alguien me puede explicar, con palabras sencillitas, las diferencias entre uno y otro? ¿y como se manejan?

En el siguiente script, ¿como hago para que la salida en pantalla sea tan solo los 'echo', pero asi y todo, el paquete se instale...

echo ./Configure
./configure
echo make
make
echo make install
make install

si uso:

./configure &> /dev/null

el 'make' posterior (en algunos casos) no me funciona correctamente.

Ademas, ¿Como capturo la salida en pantalla de la funcion 'time'? (tiempo=$(time {comandos;}) no me sirve.)

THX THX

Estandar

Imagen de pepo

Son los flujos estandar y si usas Google puedes encontrar entre los miles de enlaces el de la Wikipedia (EN) que te lo explica muy bien.

------------------------------------------------
Linux User Registered #232544
Jabber : pepo@jabberes.org
Ekiga : pepo@ekiga.net
ICQ : 337889406
GnuPG-key : www.keyserver.net

------------------------------------------------
Linux User Registered #232544
Jabber : pepo@jabberes.org
Ekiga : pepo@ekiga.net
GnuPG-key : www.keyserver.net

Esa parte, la conosco...

Imagen de ndante

Mi peticion era, alguien, con palabras sencillitas, me puede explicar lo de "stdin, stdout y stderr"; y dado que, esto pienso que lo entiendo (tan dificil no es). Me gustaría mejor que me dijeran por que no funcionan los direccionamientos (stdout a un archivo y stderr a otro) de:

./configure
make
make install

en verdad el direccionamiento si funciona, el problema es que no realiza la tarea real correctamente.

For:.- AMD socket940 64x2
.- SIDUX64 + ncurses-5.5
To:.- AMD socket940 64x2
.- CLFS 86_64 Pure 64
[Lo lograre]

For:.- AMD socket940 64x2
.- CLFS x86_64 Pure 64
To:.- AMD socket940 64x2
.- PKT 64
[Lo lograre]

redireccion - no se completa la tarea

Imagen de acl

No hay razon por la que los comandos no se puedan completar por haber sido redirigidas sus salidas. Podrías mostrarnos exactamente la falla que te da? Yo por mi parte hice la prueba con algunos paquetes y la redireccion funciono bien:


aldo@baraddur ~ $ cd tar-1.17
aldo@baraddur ~/tar-1.17 $ ./configure > config.out
aldo@baraddur ~/tar-1.17 $ echo $?
0
aldo@baraddur ~/tar-1.17 $ make > make.out
utf8.c: In function ‘string_ascii_p’:
utf8.c:94: warning: comparison is always true due to limited range of data type
aldo@baraddur ~/tar-1.17 $ echo $?
0

uff... va a ser dificil...

Imagen de ndante

Me ocurria con un script que tarda lo que no esta escrito, ademas de que me da fayos cada dos por tres, por lo que no creo que vuelva a cambiar eso para ver de nuevo un fayo corregido (opte por dejar las salidas tal cual)... ya tengo suficiente con los que me da el solo. (Todo esto dicho con enfado, pero enfado para con mi PC que no me hace caso)
de todas formas yo usaba otra forma, para redirigir toda la salida:

$(./configure > nor.con.out) &> err.con.out
$(./make > nor.ma.out) &> err.ma.out
$(./make install > nor.ins.out) &> err.ins.out

El segundo simbolo no recuerdo bien si era ese, pero esa es la idea. Cuando llegaba a make, saltaba el error. Pero este error en si, no lo recuerdo... ademas, saltaba en pantalla.

For:.- AMD socket940 64x2
.- SIDUX64 + ncurses-5.5
To:.- AMD socket940 64x2
.- CLFS 86_64 Pure 64
[Lo lograre]

For:.- AMD socket940 64x2
.- CLFS x86_64 Pure 64
To:.- AMD socket940 64x2
.- PKT 64
[Lo lograre]

Simbolos para redireccion

Imagen de acl

> para stdout
2> para stderr
< para stdin

Los parentesis no son necesarios, basta con hacer las redirecciones en secuencia:


$ ./configure > conf.salida.out 2> conf.error.out
$ make > make.salida.out 2> make.error.out
...etc

Recuerda que el make install debe correrse con permisos que permitan escribir en los directorios especificados por ./configure

sólo por curiosidad

Imagen de ndante

Para los siguientes casos, como se haría (si se puede):

echo "texto necesario en archivo.c" > archivo.c

patch ../un_parche_cualquiera # pongo esto porque creo contiene lo anterior en sus ordenes internas


desviar ahí sólo sería posible a stderr, ¿verdad?. ¿O se puede repetir el desvio de la salida de stdout (sin recibir error)?

For:.- AMD socket940 64x2
.- SIDUX64 + ncurses-5.5
To:.- AMD socket940 64x2
.- CLFS 86_64 Pure 64
[Lo lograre]

For:.- AMD socket940 64x2
.- CLFS x86_64 Pure 64
To:.- AMD socket940 64x2
.- PKT 64
[Lo lograre]

multiplexar stdout

Imagen de acl

En efecto, si se puede mantener la salida de stdout y capturarla en un archivo: para eso esta tee. Por ejemplo:


$ bzcat patchcualquiera-0.01.bz2 | patch -p0 src/proyecto/ 2>&1 | tee tooodo.out

Lo que hace tee es tomar de stdin y redirecciona los datos que le llegan al archivo pasado como arrgumento Y a la salida estandar, para poder ser reutilizado. En el ejemplo que te puse aqui, capturas la salida y error de patch en toodo.out y tambien sale todo a pantalla (aunque tambien el stderr sale por salida estandar)...

Para los casos que pones arriba no tengo claro lo que quieres decir o hacer...

Quiero...

Imagen de ndante

Compilar paquetes, pero sin ver en pantalla ningun mensaje. Ni de error, ni de ningun otro tipo. Pero si quiero que se vean lineas de texto que yo incluyo. El ejemplo del principio, pero algo más claro:
SCRIPT

echo "Se esta parcheando" &&
patch ../toma_parche > (##Aqui iria lo que pregunto##). &&

echo "Se esta realizando ./configure" &&
./configure > (##Aqui iria lo que pregunto##). &&

echo "Se esta realizando make" &&
make > (##Aqui iria lo que pregunto##). &&

echo "Se esta realizando make install" &&
make install > (##Aqui iria lo que pregunto##). &&

echo "Se estan copiando archivos" &&
cp un_archivo otro_archivo > (##Aqui iria lo que pregunto##). &&

echo "Todo correcto" &&

exit; echo "Fayo."

Y su salida en pantalla (lo que yo quiero):

Se esta parcheando
Se esta realizando ./configure
Se esta realizando make
Se esta realizando make install
Se estan copiando archivos
Todo correcto

Eso si, que en pantalla SOLO salga eso, y los errores vayan a un archivo revisable (lo demas de la pantalla /dev/null)
For:.- AMD socket940 64x2
.- SIDUX64 + ncurses-5.5
To:.- AMD socket940 64x2
.- CLFS 86_64 Pure 64
[Lo lograre]

For:.- AMD socket940 64x2
.- CLFS x86_64 Pure 64
To:.- AMD socket940 64x2
.- PKT 64
[Lo lograre]