shopt funziona nella riga di comando, non trovato quando eseguito in uno script


13

Sto scrivendo uno script per copiare alcuni file e sto provando shopt -s dotglob a abilitare cp per copiare dotfile come .jshinte quant'altro.

Posso eseguire shopt -s dotglobdirettamente a un prompt di bash senza errori. Tuttavia, l'esecuzione dello script genera l'errore:

script.sh: 81: script.sh: shopt: not found

Sto eseguendo questo script in bash shell, con l'intestazione shebang #!/usr/bin/env bash. Riga di errore:

shopt -s dotglob
cp -r $TEMP/img/* $TARGET/img/
cp -r $TEMP/js/* $TARGET/js/
cp -r $TEMP/less/* $TARGET/less/

Non trovi nulla di utile su Google, hai idea di quale sia il problema qui?


Grazie per il promemoria, risposte selezionate per tutto ciò che ho potuto. Ancora uno oltre a questa domanda che non ha ancora una buona risposta.
Kurtosis,

3
Prova con l' #!/bin/bashintestazione più semplice ?
ish

E quale versione di Ubuntu?
ish

2
@izx, questa è la risposta giusta, shoptè un built-in bash, shnon ha shopt, e il messaggio di errore sembra un messaggio di errore da dash. Quindi molto probabilmente l'errore qui sta eseguendo uno script bash sh(che in Ubuntu è dashdi default). Anche se shè un collegamento simbolico a bash, eseguire uno script bash con shnon è lo stesso con cui eseguirlo bash.
geirha,

Risposte:


23

Per formare una risposta dai commenti:

Molte persone per abitudine eseguono i loro script shinvece di bash. Questa è una buona pratica se la portabilità è un problema, ma molte persone lo fanno perché stanno copiando qualcosa che hanno visto senza capirlo.

A meno che lo script non debba essere eseguito su un sistema Linux non desktop (ad esempio, l'esecuzione di script shell su dispositivi Android è piuttosto diverso), ti consiglio di utilizzare la linea Bash shebang all'inizio:

#!/bin/bash

Questa riga, quando è la prima riga dello script, determina quale interprete (shell come bash o sh, Python, ecc.) Viene chiamato per eseguirlo. Se usi la riga sopra, otterrai lo stesso comportamento (quasi) della riga di comando, supponendo che tu usi la shell predefinita. Se per motivi di portabilità o preferenza usi una linea shebang diversa, tieni presente che dovrai consultare la documentazione per la shell a cui hai fatto riferimento, anche se la shell a cui fai riferimento è un link simbolico a Bash.


5
Per essere completamente cross-system, preferisco: #!/usr/bin/env bash poiché è compito di env sapere quale bash usare (nel caso in cui lo abbiate patchato, per esempio).
Shrikeh

-1

Devi uscire da zsh e attivare bash come mostrato:

exec bash

Esegui il comando

source ~/.bashrc

Dopo di che puoi reattivo zsh:

exec zsh

Spero possa aiutare


Hmmm. 1) Non credo che l'OP stesse usando zsh, 2) AFAIK ~/.basrcè gestito da bash all'avvio in questo caso, quindi non è necessario chiamarlo esplicitamente, 3) dove viene eseguito il comando dell'OP? e 4) usare execdue volte ti fa perdere qualsiasi cambiamento d'ambiente che hai fatto nella shell zsh iniziale, cosa che non accadrebbe se tu chiamassi bash.
xenoide,

Nel mio caso, era necessario rilevare i cambiamenti dell'ambiente e i cambiamenti persistevano. Ho appena riavviato il computer e tutte le mie modifiche sono persistite. Forse è solo specifico dell'anaconda che stavo provando a configurare
David Kabii il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.