Inicio > Debian, Programación, Resolución problemas, Scripting, Ubuntu > Python: /bin/sh: Syntax error: Bad fd number

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

Martes, 22 de junio de 2010 Dejar un comentario Ir a 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...
Python: /bin/sh: Syntax error: Bad fd number , 6.0 out of 10 based on 1 rating
Share
  1. yoni
    Miércoles, 23 de junio de 2010 a las 20:28 | #1
    GD Star Rating
    loading...

    pues muy sencillo, con el comando chsh, para ver como funciona pues una lectura al man que el comando es sencillo, aún así es tan fácil como:

    chsh -s bash

    También podéis modificarlo en el fichero /etc/passwd cambiando al usuario que queráis el emulador de terminal por defecto a usar:

    yoni:x:1000:1000:Jonathan Rodríguez Suárez,,,:/home/yoni:/bin/bash

    Saludos

  2. Miércoles, 23 de junio de 2010 a las 21:01 | #2
    GD Star Rating
    loading...

    Wow! Muchas gracias yoni desconocía totalmente ese comando, ya le he echado un vistazo al man y es exactamente lo que necesitaba. En cuanto lo pruebe y vea que funciona actualizo el post, pero ahora voy a salir un rato a divertirme jeje.

    Dan gusto estas contribuciones :D

  3. Viernes, 25 de junio de 2010 a las 09:00 | #3
    GD Star Rating
    loading...

    Yoni, probé tu propuesta pero python seguía llamando por defecto a /bin/sh. Pero he encontrado otra solución y ya he actualizado la entrada ;) . Gracias de todos modos por tu contribución.

    Saludos.

  1. Sin trackbacks aún.