Estoy tratando de ejecutar un bash script en mi máquina de Ubuntu y me está dando un error:

función no se encuentra

Para probar, he creado el siguiente script que funciona bien en mi laptop pero no en mi Escritorio. Alguna idea de por qué? Mi portátil es un mac si que es relevante.

#!/bin/bash

function sayIt {   
   echo "hello world"
}

sayIt

Esto devuelve «hola mundo» en mi portátil, pero en mi Escritorio devuelve:

run.sh: 3: función no se encontró hola mundo run.sh: 5: error de Sintaxis:
«}» inesperado

InformationsquelleAutor E T | 2012-09-18

4 Comentarios

  1. 116

    Probable es que en el escritorio no son en realidad la que se ejecuta bajo bash sino dash o algún otro compatible con POSIX shell que no reconoce la function palabra clave. El function palabra clave es una bashism, un golpe de extensión. POSIX sintaxis no uso function y exige el uso de paréntesis.

    $ more a.sh
    #!/bin/sh
    
    function sayIt {   
       echo "hello world"
    }
    
    sayIt
    $ bash a.sh
    hello world
    $ dash a.sh
    a.sh: 3: function: not found
    hello world
    a.sh: 5: Syntax error: "}" unexpected

    El POSIX-sintaxis funciona en ambos:

    $ more b.sh
    #!/bin/sh
    
    sayIt () {   
       echo "hello world"
    }
    
    sayIt
    $ bash b.sh
    hello world
    $ dash b.sh
    hello world
    • wiki.ubuntu.com/DashAsBinSh
    • function viene desde el shell de korn, que pre-fechas de bash.
    • +1 Tenía este mismo problema, pero el bash todavía realizaría como se esperaba. Al menos con tu explicación sé que el porque y como! 🙂
    • Así que, ¿cómo ejecutar un script en bash en lugar de guión o POSIX shell?
    • Una causa probable es que el script no tiene el bit de ejecución establecido para la ejecución de usuario, lo que significa que se lea como un simple script de shell. Asegúrese de que es correcta y que el shebang camino realmente llama Bash.
  2. 11

    Yo enfrentan el mismo problema, he modificado la sintaxis y trabajó para mí. Intente quitar la palabra clave función y agregar entre paréntesis () después de que el nombre de la función.

    #!/bin/bash
    
    sayIt()
    {   
       echo "hello world"
    }
    
    sayIt
  3. -5

    No se requieren () después del nombre de la función, o en la llamada?

    function sayIt() { ...
    }
    
    sayIt()

    ? 🙂

    Hmm, en realidad, en MI mac, funciona igual de pegado..

    dtpwmbp:~ pwadas$ cat aa.sh 
    #!/bin/bash
    
    function sayIt() {   
       echo "hello world"
    }
    
    sayIt
    
    dtpwmbp:~ pwadas$ ./aa.sh 
    hello world
    dtpwmbp:~ pwadas$ 

    Comparar bash versión, AFAIR alguna versión antigua necesario «()»s.

    dtpwmbp:~ pwadas$ bash --version
    GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
    Copyright (C) 2007 Free Software Foundation, Inc.
    dtpwmbp:~ pwadas$ 

    También comparar el estado de shopt opciones ( man bash ), en tanto conchas, tal vez uno de ellos tiene algunos compat sintaxis de encendido o apagado ? «shopt» comando sin argumentos se lista el estado de las opciones compatibles.

    ¿Qué es la «función» palabra clave utilizada en algunos scripts de bash?

    • Me da: error de Sintaxis «(» inesperado
    • Tristemente, yo realmente no sé por qué mi respuesta para esta pregunta fue votada abajo :/
    • Usted debe incluir el () en la definición de la función, pero no cuando se llama a la función.
    • Yo no downvote, pero en realidad es más una pregunta que una respuesta.
    • sí, su respuesta es realmente una pregunta acerca de la respuesta anterior. por lo que debe ser un comentario sobre la respuesta y no respuesta, sí
    • function foo() { es en realidad más inválida que function foo {. El function foo { sintaxis es compatible en viejas versiones de ksh, moderno y conchas que tratar de mantener la compatibilidad con ellos, pero no se requiere ser apoyado por los proyectiles compatible con la de 1992 POSIX sh estándar. Por el contrario, foo() { es válida en todos los compatibles con POSIX conchas. function foo() { es un híbrido de los dos formatos, y menos ampliamente admitido que, ya sea por su propia cuenta. Consulte wiki.bash-hackers.org/scripting/obsolete

Dejar respuesta

Please enter your comment!
Please enter your name here