¿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
Buzu
fuente
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.

kev
fuente
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

Smeterlink
fuente