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.