Messaggio di errore "origine: non trovato" durante l'esecuzione di uno script


35

Sto creando un piccolo script di installazione automatica che modificherà /etc/profilee $HOME/.profilese alcuni percorsi non vengono esportati. Quindi, vorrei ricaricarli automaticamente.

Ho letto che lo sourcefa, quindi ho acceso il mio terminale ed ho inserito:

source /etc/profile
source ~/.profile

Dal terminale, non ha generato alcun errore.

Tuttavia, inserendo questi due comandi all'interno dello script Bash si ottiene source: not found.

  1. Come posso essere sicuro che lo script sia eseguito da Bash, anche se #!/bin/shè specificato (apparentemente, non lo garantisce)?
  2. Perché direbbe che queste due fonti non possono essere trovate quando sono inequivocabilmente lì?

Risposte:


54

/bin/shnon lo è bash. Per eseguire lo script con bash, scrivi #!/bin/bashcome prima riga dello script.

L'errore source: not foundnon viene eliminato perché /etc/profilenon è stato trovato. È stato eliminato, perché sourcenon è stato trovato. sourceè una funzione integrata di Bash e non esegui lo script con bash. Quindi è chiaro perché non è stato trovato. Cambia la #!riga nello script e funzionerà.


9

1. Come posso essere sicuro che lo script sia eseguito da Bash, anche se #!/bin/shè specificato (apparentemente, non lo garantisce)?

Per essere sicuro che uno script scritto per shshell (come nel tuo caso - vedi Qual è la differenza tra #! / Bin / sh e #! / Bin / bash? ) Viene eseguito da Bash, basta eseguire il seguente comando:

bash script_name

Pertanto, non otterrai più questo errore.

2. Perché direbbe che queste due fonti non possono essere trovate quando sono inequivocabilmente lì?

Non dice che quei file di provenienza non ci siano. Dice che il sourcecomando non è stato trovato. Questo è normale, perché da quando inizi lo script con la #!/bin/shriga, lo script verrà eseguito usando she non bashcome potresti pensare. Perché è normale? Perché sourcecommand è un built-in di Bash, ma non un shbuilt-in. Per eseguire il sorgente di un file sh, è necessario utilizzare .(punto). Esempio:

. /etc/profile
. ~/.profile

Un altro modo è quello di cambiare la linea di Shebang #!/bin/bashcome diceva il caos nella sua risposta .


4

Vedi questa domanda SO :

/bin/shdi solito è qualche altra shell che cerca di imitare The Shell. Molte distribuzioni usano /bin/bashper sh, supporta il sorgente. Su Ubuntu, tuttavia, /bin/dashviene utilizzato che non supporta l'origine. Se non è possibile modificare lo script, provare a cambiare la shell che lo esegue.


1

Alcune shell supportano .invece di source. Quindi puoi provare qualcosa del genere

. filename

invece di

source filename

Spero funzioni

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.