last day (15 days later) » 

17:01
2
A: Como puedo hacer un "for line in" en reversa? Que la ultima palabra se procese de primero en BASH script

Patricio MorachoHay varias formas, pero si ya que estás usando cat para leer el archivo de entrada, bien podrías usar tac (la inversa de cat), que seguramente ya tienes en el sistema por que forma parte de las coreutils. #!/bin/bash while IFS= read -r line; do Extract $line if [ "$x" != "false" ] then ...

No me deja editarlo, pero el < "$(tac file)" no funciona aquí. Necesitas un "stream" como entrada, y el "$(tac file)" es un string. Querías escribir < <(tac file) y no < "$(tac file)".
Gracias @terdon, funcionar, al menos colateralmente, funciona, pero estoy de acuerdo contigo que no es la forma adecuada. Ahí lo edito.
Bueno, no, ni si quiera funcionará. Te dará error bash: $(tac file): ambiguous redirect en bash o sh: $(tac file): No such file or directory en sh o dash: 1: cannot open ij kl en dash (donde ij kl es la primera linea de salida del tac file. El < del while espera un fichero, si no le des fichero se queja. El <(comando) funciona como fichero.
@terdon, no digo que este bien, solo digo que lo he probado en bash versión <4 y superiores y ha funcionado.
¡Que raro! No conozco ninguna version de ningun shell que podría aceptar < $(comando) como entrada de un while. Y lo he probado con bash 5.0.7, 4.4.19 y 4.3.48 y me da el error que mencioné antes.
17:01
@terdon, si te sirve el dato, inicialmente lo verifiqué con un bash v3 en un entorno mingw bajo windows.
@PatricioMoracho Ah! Eso puede que cambie todo. No tengo ni idea como funcionan las cosas bajo Windows.
Si sirve el dato, acabo de probarlo, en bash 4.3.48 bajo linux. Funciona, y al final emite un error "Filename too long"
@PatricioMoracho No, en serio? Me puedes mostrar el codigo exacto?
(y también me puedes decir de dejarte en paz, es que me interesan estas cosas pero no te quiero molestar)
#!/bin/bash

while IFS= read -r line; do
echo "$line"
done < "$(tac test.html)"
test.html, es un file local que tengo
@PatricioMoracho Ah, OK, pero porque dices que funciona?
Eso es que intenta abrir un fichero cuyo nombre es todo el contenido de test.html.
mejor dicho, toda la salida de tac test.html.
Si fuera mas pequeño, se quejaría de ambiguous redirect, pero como es tan largo, falla el open() interno del sistema supongo.
17:16
Por que la salida en reversa la muestra
Me dices que empieza a darte salida y solo después te da el error?
$ printf '<html>\n<head>\n</head>\n<body>\nfoo\n</body>\n</html>\n' > test.html
$ while IFS= read -r line; do  echo "$line" ; done < "$(tac test.html)"
bash: $(tac test.html): No such file or directory
$ while IFS= read -r line; do  echo "$line" ; done < $(tac test.html)
bash: $(tac test.html): ambiguous redirect
Esto si que es extraño!
Bueno, no quiero molestarte. Gracias por tomar el tiempo de hacer estos tests! Si te interesa a ti también, lo estamos hablando en el dev/chat.
Por si acaso te interesa, creo que lo que estas viendo es que la salida de tac file esta incluida en el error. No lo puedo reproducir con bash, pero lo veo con otros shells. Es lo mismo que pasa aquí:
$ seq 1000 > file
$ touch "$(tac file)" |& tail -c50
n''4'$'\n''3'$'\n''2'$'\n''1': File name too long
Entonces parece como si funciona, pero no :)
17:34
En el entorno mingw, directamente funciona como se esperaría, el error, es justo después de la última linea del archivo:
<head>
<html xmlns="http://www.w3.org/1999/xhtml">
<!DOCTYPE html>: File name too long
Es raro, es cierto, gracias por el comentario, me ha servido
@PatricioMoracho Si, exacto. El contenido es parte del error!
Como si te quieren confundir!
Un éxito colateral de un error.
Eso! :)

last day (15 days later) »