Archivo

Entradas Etiquetadas ‘Script’

Python: /bin/sh: Syntax error: Bad fd number

Martes, 22 de junio de 2010 3 comentarios

Editado/Edited: 25/06/10

Estoy probando unos scripts en Python que me han pasado (y que han sido desarrollados sobre Debian) y he tenido problemas a la hora de ejecutarlos. Cuando intentaba ejecutar estos scripts en mi ordenador me lanzaban el siguiente mensaje de error, entre otros:

/bin/sh: Syntax error: Bad fd number

El problema se encuentra en las llamadas que se hacen en el script a os.system() para ejecutar algunos comandos de consola. Como ya he dicho, los scripts han sido desarrollados sobre una plataforma Debian, pero en mi distribución Ubuntu no han funcionado. Esto se debe a que en ubuntu por defecto los comandos se ejecutan por sh y no por bash.

La solución que he visto ya propuesta en varios sitios es eliminar el comando sh de su sitio y hacer un enlace simbólico desde el comando bash a sh. Es una forma un poco bestia de hacerlo … pero no he visto ninguna otra solución. Si alguien conoce una forma más elegante de hacer esto que lo comente por favor.

sudo mv /bin/sh /bin/sh.bak
sudo ln -s /bin/bash /bin/sh

Visto aquí.

Otra solución mejor

En vez de tener que hacer este enlace simbólico mediante el módulo subprocess podemos especificar que terminar queremos usar mediante la opción executable. A continuación os dejo un método que me he creado para hacer llamadas a programas por la terminal usando /bin/bash en vez de la terminal por defecto (/bin/sh en ubuntu)

def run_shell_program (cmd):
  try:
    retcode = subprocess.call(cmd, shell=True, executable="/bin/bash")
    if retcode != 0:
      print >> sys.stderr, "Error executing command: %s" % cmd,\
      "(return code: %s)" % retcode
  except OSError, e:
    print >>sys.stderr, "Execution failed: %s" % cmd, e

See this page.

A better solution

Instead of making the symbolic link explained in the above post we can use the subprocess module in python in order to specify the shell executable we want to use. The next method written in python is used to run shell command using /bin/bash instead of the default shell command (/bin/sh in Ubuntu)

def run_shell_program (cmd):
  try:
    retcode = subprocess.call(cmd, shell=True, executable="/bin/bash")
    if retcode != 0:
      print >> sys.stderr, "Error executing command: %s" % cmd,\
      "(return code: %s)" % retcode
  except OSError, e:
    print >>sys.stderr, "Execution failed: %s" % cmd, e
GD Star Rating
loading...
Share

Bash script: Trabajando en sed con variables bash

Domingo, 14 de marzo de 2010 1 comentario

En esta entrada voy a explicar una forma para poder trabajar con variables de entorno dentro de sed. Leer más…

GD Star Rating
loading...
Share
Categories: Programación, Scripting Tags: , , ,

Bash script: Redondear número flotante

Lunes, 8 de febrero de 2010 4 comentarios

Otra entrada de bash script, que últimamente lo tengo que tocar mucho. Voy a explicar algunas formas de poder redondear un número flotante a un entero, algo que en algunas ocasiones se hace indispensable. Leer más…

GD Star Rating
loading...
Share

Bash script: Midiendo el tiempo de ejecución de programas

Sábado, 6 de febrero de 2010 2 comentarios

El comando time en GNU/Linux nos permite conocer muchos detalles sobre el tiempo de ejecución de otro comando o aplicación que ejecutemos. Cuando ejecutamos el programa time sin ninguna opción obtenemos una salida similar a la siguiente

 time comando argumentos
...
salida comando
...
real	0m0.010s
user	0m0.010s
sys	0m0.000s

Donde real indica el tiempo que ha pasado desde que se ejecuta el comando hasta que termina, user indica el tiempo usado por el proceso en modo usuario y sys muestra el tiempo usado por el sistema en manejar el proceso (modo kernel). Generalmente se coge como el tiempo de ejecución de un programa a la suma de las cantidades retornadas por user y sys, ya que si el sistema tiene una carga de procesamiento importante Leer más…

GD Star Rating
loading...
Share

Scripting: Obtener número de procesadores

Jueves, 8 de octubre de 2009 Sin comentarios

terminal-icon

Última actualización: 20/09/2011

Voy a empezar hoy una nueva categoría denominada Scripting para introducir algunas líneas de comandos o scripts que pueden ser útiles para realizar algunas de las tareas que más solemos necesitar la gente que trabajamos a menudo con los bash scripts.

Aquí os dejo una sencilla línea que debería funcionar en cualquier distribución GNU/Linux. Simplemente busca la palabra cores en el fichero /proc/cpuinfo e imprime el cuarto campo de dicha línea. Después de esto ejecuto el comando exit para terminar la ejecución del programa, ya que si tenemos un procesador con varios núcleos, sin el comando exit nos aparecería el número de núcleos tantas veces como núcleos tengamos.

awk '/cores/ {print " ", $4; exit} ' /proc/cpuinfo

Recuerda si quieres asignar el número de cores a una variable tendras que escribir una línea parecida a la siguiente:

THREADS=`awk '/cores/ {print " ", $4; exit} ' /proc/cpuinfo`

En caso de que dispongamos de uno de los nuevos procesadores de intel (iCore 7, Xeon o similares) que cuentan con la característica de poder ejecutar dos hilos por núcleo, en el fichero /proc/cpuinfo nos mostrará que disponemos de 8 procesadores aunque el campo cores seguirá mostrando 4. Para trabajar con los 8 hilos en vez de con 4 podemos utilizar el siguiente comando:

THREADS=$((`awk '/processor/ {print " ", $3;} ' /proc/cpuinfo | tail -n 1` + 1))
GD Star Rating
loading...
Share