Estoy escribiendo una secuencia de comandos para copiar algunos archivos, y estoy tratando de usar shopt -s dotglob
para habilitar cp para copiar archivos de puntos como .jshint
y otras cosas.
Puedo ejecutar shopt -s dotglob
directamente en un indicador de bash sin error. Sin embargo, ejecutar el script arroja el error:
script.sh: 81: script.sh: shopt: not found
Estoy ejecutando este script en bash shell, con el encabezado shebang #!/usr/bin/env bash
. Línea de error:
shopt -s dotglob
cp -r $TEMP/img/* $TARGET/img/
cp -r $TEMP/js/* $TARGET/js/
cp -r $TEMP/less/* $TARGET/less/
Al no encontrar nada útil en Google, ¿alguna idea de cuál es el problema aquí?
#!/bin/bash
encabezado más simple ?shopt
es un bash incorporado,sh
no tieneshopt
, y el mensaje de error parece un mensaje de error dedash
. Entonces, lo más probable es que el error aquí esté ejecutando un script bash consh
(que en Ubuntu esdash
por defecto). Incluso sish
es un enlace simbólico abash
, ejecutar un script bash consh
no es lo mismo que ejecutarlo conbash
.Respuestas:
Para formar una respuesta a partir de los comentarios:
Muchas personas por costumbre ejecutan sus scripts en
sh
lugar debash
. Esta es una buena práctica si la portabilidad es una preocupación, pero muchas personas lo hacen porque están copiando algo que han visto sin entenderlo.A menos que su script necesite ejecutarse en un sistema Linux que no sea de escritorio (por ejemplo, ejecutar scripts de shell en dispositivos Android es bastante diferente), le recomiendo usar la línea Bash shebang al principio:
Esta línea, cuando es la primera línea del script, determina qué intérprete (shell como bash o sh, Python, etc.) se llama para ejecutarla. Si usa la línea anterior, obtendrá el mismo comportamiento (casi) como lo hace desde la línea de comando, suponiendo que use el shell predeterminado. Si por razones de portabilidad o preferencia usa una línea shebang diferente, tenga en cuenta que tendrá que consultar la documentación del shell al que hace referencia, incluso si el shell al que hace referencia es un enlace simbólico a Bash.
fuente
#!/usr/bin/env bash
ya que es el trabajo de env saber qué bash usar (en caso de que lo haya parcheado, por ejemplo).Debe salir de zsh y activar bash como se muestra:
El ejecutar el comando
Después de lo cual puede reaccionar zsh:
Espero que ayude
fuente
~/.basrc
se ejecuta mediante bash al inicio en este caso, por lo que no hay necesidad de llamarlo explícitamente, 3) ¿dónde se ejecuta el comando del OP? y 4) usarexec
dos veces te hace perder cualquier cambio de entorno que hayas hecho en el shell zsh inicial, lo que no sucedería si solo llamaras a bash.