script - Reutilizando la salida del último comando en Bash
scripts bash ejemplos (7)
¿La salida de un comando Bash está almacenada en cualquier registro? Por ejemplo, algo similar a $?
capturando la salida en lugar del estado de salida.
Podría asignar el resultado a una variable con:
output=$(command)
pero eso es más tipear ...
Como dijo konsolebox, tendrías que piratear en bash. Here hay un buen ejemplo de cómo uno puede lograr esto. El repositorio stderred (en realidad destinado a colorear stdout) da instrucciones sobre cómo construirlo.
Lo intenté: definir un nuevo descriptor de archivo dentro de .bashrc
como
exec 41>/tmp/my_console_log
(el número es arbitrario) y modifica stderred.c
consecuencia para que el contenido también se escriba en fd 41. Funcionó, pero contiene una gran cantidad de bytes NUL, formateos raros y básicamente son datos binarios, no legibles. Tal vez alguien con buenos conocimientos de C podría probarlo.
Si es así, todo lo que se necesita para obtener la última línea impresa es tail -n 1 [logfile]
.
Inspirado por la respuesta de anubhava, que creo que no es realmente aceptable ya que ejecuta cada comando dos veces.
save_output() {
exec 1>&3
{ [ -f /tmp/current ] && mv /tmp/current /tmp/last; }
exec > >(tee /tmp/current)
}
exec 3>&1
trap save_output DEBUG
De esta forma, la salida del último comando está en / tmp / last y el comando no se llama dos veces.
La respuesta es no. Bash no asigna ninguna salida a ningún parámetro o bloque en su memoria. Además, solo se le permite acceder a Bash mediante sus operaciones de interfaz permitidas. Los datos privados de Bash no son accesibles a menos que lo piratees.
No estoy seguro exactamente de lo que necesita esto, por lo que esta respuesta puede no ser relevante. Siempre puedes guardar el resultado de un comando: netstat >> output.txt
, pero no creo que sea eso lo que estás buscando.
Sin embargo, hay opciones de programación; simplemente podría obtener un programa para leer el archivo de texto anterior luego de que se ejecute dicho comando y asociarlo con una variable, y en Ruby, mi lenguaje de elección, puede crear una variable fuera de la salida del comando usando ''backticks'':
output = `ls` #(this is a comment) create variable out of command
if output.include? "Downloads" #if statement to see if command includes ''Downloads'' folder
print "there appears to be a folder named downloads in this directory."
else
print "there is no directory called downloads in this file."
end
Pegue esto en un archivo .rb y ejecútelo: ruby file.rb
y creará una variable fuera del comando y le permitirá manipularlo.
Puede usar esto: $(!!)
para recalcular (no reutilizar) la salida del último comando.
El !!
por sí solo ejecuta el último comando.
$ > echo pierre
pierre
$ > echo my name is $(!!)
echo my name is $(echo pierre)
my name is pierre
Si está en Mac y no le importa almacenar su salida en el portapapeles en lugar de escribir en una variable, puede usar pbcopy y pbpaste como solución alternativa.
Por ejemplo, en lugar de hacer esto para encontrar un archivo y modificar sus contenidos con otro archivo:
$ find app -name ''one.php''
/var/bar/app/one.php
$ diff /var/bar/app/one.php /var/bar/two.php
Podrías hacer esto:
$ find app -name ''one.php'' | pbcopy
$ diff $(pbpaste) /var/bar/two.php
La cadena /var/bar/app/one.php
está en el portapapeles cuando ejecuta el primer comando.
Por cierto, pb en pbcopy
y pbpaste
stand for pbpaste
, un sinónimo de portapapeles.
Una forma de hacerlo es usando trap DEBUG
:
f() { bash -c "$BASH_COMMAND" >& /tmp/out.log; }
trap ''f'' DEBUG
Ahora stdout y stderr del comando ejecutado más recientemente estarán disponibles en /tmp/out.log
El único inconveniente es que ejecutará un comando dos veces: una vez para redirigir la salida y el error a /tmp/out.log
y una vez normalmente. Probablemente haya alguna forma de prevenir este comportamiento también.