2011-05-12 26 views
15

Estoy intentando utilizar el comando script para iniciar sesión en bash.Script Bash: uso del comando "script" de un script bash para iniciar sesión

El comando script se ejecuta desde un script bash pero, tan pronto como se ejecuta, termina el script bash.

He intentado invocar el comando utilizando varias combinaciones siempre con el mismo resultado (terminación del script bash tan pronto como se llame al comando). La salida que tengo es la siguiente:

Script started, file is typescript 
[email protected]: ... 

También he tratado de invocar el comando con un & al final pero de nuevo sin suerte.

¿Alguien puede decirme cómo debo invocar el comando desde un script bash?

Gracias

+1

Por favor muéstranos tu script bash, o al menos la línea 'script'. –

+0

Desde el prompt del script, haga un ps (sin parámetros), que debería mostrar lo que está sucediendo. ¿Por qué crees que no está funcionando? Si es porque el texto mecanografiado está "vacío", significa que estás sufriendo de almacenamiento en memoria intermedia. – cdarke

+0

@Robin Green: Puedes encontrar mi script aquí: [link] (http://pastebin.com/CuAyPfhM) – limp

Respuesta

16

Su script de shell no finaliza. Todavía está funcionando. Recibirá un mensaje porque script está generando un nuevo shell.

El caso de uso para script es:

  1. inicio script (genera un nuevo shell)
  2. qué comandos
  3. salida de comandos (Salir) y soltar a la cáscara anterior
  4. examinar o archivo de registro de impresión creado por script

Así que básicamente script está funcionando como se esperaba. Tendrás que encontrar otra forma de lograr lo que quieres.

Puede registrar la ejecución de la secuencia de comandos de esta manera:

#! /bin/bash 
exec > logfile 2>&1 
set -x 
FOO=BAR 
echo $FOO 

Explicación

  • exec > logfile 2>&1 redirige la salida estándar y stderr a logfile
  • set -x hace de impresión fiesta de cada comando antes de ejecutarlo

Examen ple:

$ ./foo.sh 
$ cat logfile 
+ FOO=BAR 
+ echo BAR 
BAR 

La desventaja de este método es que el script no imprime ningún resultado para que los humanos lo vean. Todo va al archivo de registro.

Alternativamente, puede hacerlo de esta manera:

#! /bin/bash 
# nothing special here 
FOO=BAR 
echo $FOO 

a continuación, ejecutar la siguiente manera:

$ script -c "bash -x foo.sh" 
Script started, file is typescript 
+ FOO=BAR 
+ echo BAR 
BAR 
Script done, file is typescript 
$ cat typescript 
Script started on Mi 18 Mai 2011 01:05:29 CEST 
+ FOO=BAR 
+ echo BAR 
BAR 

Script done on Mi 18 Mai 2011 01:05:29 CEST 
+0

Con el comando script BSD (MacOS X) no usas el argumento '-c' ni las comillas El comando. Será 'script bash -x foo.sh' –

5

Su escritura del golpe todavía está en marcha, pero ha dado lugar a una nueva consola interactiva.La secuencia de comandos bash está esperando a que se complete el script, lo que solo ocurrirá cuando finalice el shell interactivo (ya sea porque lo mataron o por el usuario escribiendo exit).

Para que el comando después de iniciar sesión por scriptscript, hacerlo de esta manera:

script build_log -c 'echo -e "* This line should appear inside the /"build_log/" log file..."' 

Sin embargo, script dejará de correr después de ejecutar el comando.

Para ejecutar comandos múltiples dentro de script, ponga esos comandos dentro de otra secuencia de comandos bash y especifique esa secuencia de comandos bash como el comando para ejecutar la opción -c.

+0

¡Gracias! esto fue EXACTAMENTE lo que estaba buscando. Hago mucho make x, make y, etc. y scripting individualmente en la línea de comando. Terminé usando un archivo .sh y llamé 'script results1.txt -c" make x "' para cada uno de mis comandos make. ¡MUY ÚTIL! – redhotspike

+0

Con el comando de script BSD (MacOS X) no necesita el argumento '-c' o las comillas alrededor del comando.Será 'script build_log echo '* Esta línea debería aparecer dentro del archivo de registro" build_log "...' ' –

2

Puede utilizar un truco dentro de su script de shell para iniciar el script o no iniciarlo. Basado en un argumento especial, puede elegir ejecutarse a sí mismo con un argumento especial para que el script no se inicie nuevamente.

Esto probablemente se debe explicar lo que quiero decir:

if [ "$1" != "noscript" ] ; then 
     # execute self with the noscript special arg so that the second execution DOES NOT start script again. 
     exec script -q -c "$0 noscript $1 $2 $3" /build/buildlog_`date '+%Y%m%d%H%M%S'`.log 
     echo Problem in $0, please check. 
     exit 1; 
fi 
...Rest of the script should follow here. 

He intentado esto, y funciona bien. A menos que sea particular acerca del tipo de argumentos que deben aprobarse, y que el script esté planificado para ser utilizado por usuarios hostiles, esto debería ser suficiente :).

3

Siguiendo la idea de execve, también puede utilizar una variable de entorno: Respuesta

#!/bin/sh 
[ -z "$TYPESCRIPT" ] && TYPESCRIPT=1 exec /usr/bin/script -c "TYPESCRIPT=1 $0 [email protected]" 
# your script here... 
1

de juj es grande, pero no puede pasar en argumentos correctamente. El problema básico es el uso de [email protected] dentro de una cadena de comillas dobles. $* se debe utilizar en su lugar:

#!/bin/sh 
[ -z "$TYPESCRIPT" ] && TYPESCRIPT=1 exec /usr/bin/script -c "TYPESCRIPT=1 $0 $*" 
# your script here... 

Esto es lo que sucede con [email protected]:

foo.sh:

#!/bin/sh 
if [ -z $FOO ] 
then 
    FOO=1 exec $0 [email protected] 
else 
    ./echo_args.sh "$0 [email protected]" 
fi 

bar.sh:

#!/bin/sh 
echo 0 $0 
echo 1 $1 
echo 2 $2 
echo 3 $3 

Ahora ./foo.sh with some arguments salidas

0 ./bar.sh 
1 /path/to/foo.sh with 
2 some 
3 arguments 

Esto haría que algunos de los argumentos que se pasarán a script en lugar de a la segunda ejecución del foo.sh.