Shopt funciona en la línea de comandos, no se encuentra cuando se ejecuta en un script

13

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 .jshinty otras cosas.

Puedo ejecutar shopt -s dotglobdirectamente 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í?

Curtosis
fuente
Gracias por el recordatorio, respuestas seleccionadas para todo lo que pude. Todavía una además de esta pregunta que aún no tiene una buena respuesta.
Kurtosis
3
Probar con el #!/bin/bashencabezado más simple ?
ish
¿Y qué versión de Ubuntu?
ish
2
@izx, esa es la respuesta correcta, shoptes un bash incorporado, shno tiene shopt, y el mensaje de error parece un mensaje de error de dash. Entonces, lo más probable es que el error aquí esté ejecutando un script bash con sh(que en Ubuntu es dashpor defecto). Incluso si shes un enlace simbólico a bash, ejecutar un script bash con shno es lo mismo que ejecutarlo con bash.
geirha

Respuestas:

23

Para formar una respuesta a partir de los comentarios:

Muchas personas por costumbre ejecutan sus scripts en shlugar de bash. 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:

#!/bin/bash

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.

Scott Cesantía
fuente
55
Para ser completamente entre sistemas, prefiero: #!/usr/bin/env bash ya que es el trabajo de env saber qué bash usar (en caso de que lo haya parcheado, por ejemplo).
shrikeh
-1

Debe salir de zsh y activar bash como se muestra:

exec bash

El ejecutar el comando

source ~/.bashrc

Después de lo cual puede reaccionar zsh:

exec zsh

Espero que ayude

David Kabii
fuente
Hmmm 1) No creo que el OP estuviera usando zsh, 2) AFAIK ~/.basrcse 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) usar execdos 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.
xenoid
En mi caso, era necesario recoger los cambios del entorno y los cambios persistieron. Acabo de reiniciar la computadora y todos mis cambios persisten. Tal vez es solo específico de la anaconda que estaba tratando de configurar, sin embargo
David Kabii