¿Por qué obtengo [[: no encontrado al ejecutar un script?


14

Estoy tratando de escribir un script que tenga que verificar si existe un archivo. En la consola escribo

if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

y consigo

not mod

pero cuando escribo un guión para hacer lo mismo:

#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

y luego ejecuto el script, obtengo esto:

./ex.sh: 2: [[: not found
mod

Guardé el script en el directorio actual y lo llamé ex.sh, luego me aseguré de que sea ejecutable. Para llamar al guión hago esto:

./ex.sh

¿Por qué tengo este problema? Ya probé muchas cosas:

if [ -a /home ...

y

if test -a /home ...

Ambos regresan

13: -a: unexpected operator

Pude hacerlo funcionar, pero para eso tuve que eliminar la primera línea (#! / Bin / sh) ¿Sabes por qué sucede esto?
Buzu

try#!/bin/bash
kev

hola kev, también lo reviví. Acabo de actualizar mi pregunta. Pasé demasiado tiempo en esto, pero me alegro de poder resolverlo. Gracias por tu respuesta. De hecho, es la solución al problema.
Buzu

@Kev Por favor, publique eso como respuesta
slhck

Buzu, @Kev: si encuentra una respuesta, publíquela como respuesta a continuación , no edite la pregunta.
Grawity

Respuestas:


9

Está ejecutando un script escrito para bash bajo sh , que carece de muchas de las características de sintaxis extendida: [[es un bashcomando incorporado y no está disponible en sh.

Cambiar #!/bin/sha #!/bin/basho para #!/usr/bin/env bash.


En algunos sistemas, /bin/shes un enlace simbólico a /bin/bash. Y probablemente sea razonablemente seguro asumir que bashes así /bin/bash.
Keith Thompson el

@Keith: está /bin/bashen la mayoría de los sistemas Linux, pero /usr/pkg/bin/bashen BSD, o /usr/local/bin/bashsi se compila directamente desde la fuente.
Grawity

@grawity: O donde sea que decidas ponerlo si compilas desde la fuente. Ok, buen punto. Personalmente, prefiero editar el shebang para cada sistema que usar el /usr/bin/envhack (que usa el que bashesté en las personas que llaman $PATHen este momento), pero YMMV. (Y puedes hacer /bin/bashun enlace simbólico, si tienes derechos de administrador y no te importa jugar con él /bin.)
Keith Thompson

@Keith: /usr/locales donde autotools decide ponerlo por defecto. En lo que respecta a "personalmente", me gusta tener varios servidores y máquinas virtuales diferentes extraídos del mismo repositorio de scripts / herramientas, y no tener que volver a editar los shebangs en la mitad de ellos después de cada confirmación.
Grawity

ninguno de ellos funcionó para mí: / estoy en centos
astroanu

0

Especifique bash en lugar de sh cuando ejecute el script. Personalmente noté que son diferentes en ubuntu 12.10:

bash script.sh arg0 ... argn

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.