comando sorgente non trovato in sh shell


148

Ho uno script che usa la shshell. Viene visualizzato un errore nella riga che utilizza il sourcecomando. Sembra che sourcenon sia incluso nella mia shshell.

Se provo esplicitamente a correre sourcedalla shell ottengo:

sh: 1: source: not found

Dovrei in qualche modo installare "source"? Ho una versione sbagliata di sh?


1
Si potrebbe ragionevolmente sostenere che una shell che supporta sourceè una "versione sbagliata".
William Pursell,

1
Inoltre, il messaggio di errore source: not foundindica che il sourcecomando è stato valutato correttamente, ma il file che avrebbe dovuto leggere non esiste.
Simon Richter,

4
Non è possibile "installare" source perché è una caratteristica della shell. Non può essere implementato come comando esterno.
Christopher Schultz,

Risposte:


152

/bin/shdi solito è qualche altra shell che cerca di imitare The Shell. Molte distribuzioni usano /bin/bashper sh, supporta source. Su Ubuntu, tuttavia, /bin/dashviene utilizzato che non supporta source. La maggior parte delle shell usa .invece di source. Se non riesci a modificare lo script, prova a cambiare la shell che lo esegue.


2
Grazie! Sostituire / bin / sh con / bin / bash ha funzionato su Ubuntu! Sono curioso di sapere perché, però, su Ubuntu bash è sh?
Milad,

1
@Milad: su Ubuntus recente, /bin/shchiama /bin/dash. Tradizionalmente, /bin/shchiamata /bin/bashè la modalità di compatibilità sh.
Choroba,

@Milad Penso che non funzioni su Ubuntu 14.04. Qual è la tua versione del sistema operativo?
Reza Ameri,

1
Forse aiuto noto - se si dispone di script in cascata, rinominare tutto "sh -> bash". Grazie. :-)
BG Bruno,

Purtroppo non mi è stato subito intuitivo come risolvere questo problema, ma mi ha messo sulla strada giusta. Ho dovuto aggiungere SHELL := /bin/bashall'inizio del mio Makefile.
anon58192932

136

Nella shell Bourne (sh), utilizzare il. comando per l'origine di un file

. filename

Non mi è davvero permesso cambiare lo script, funziona bene su un server Redhat. Ma su quel server, la fonte sembra essere inclusa in sh
Milad il

2
Se sourcece l' ha non è rigorosamente sh.
Tripleee

4
Ho avuto questo tipo di problema su Jenkins (cercando di trovare un file archiviato come "file segreto") e approvando "." il comando era la soluzione.
Jan Vlcinsky,

Questa dovrebbe essere la risposta migliore in quanto funzionerà con sh, dash e bash.
Akhan

4
Per compatibilità con Mac OS (ambiente di sviluppo) e Travis-CI (ambiente di test), ho dovuto usare . ./filename. Altrimenti, visualizzerei un sh: 1: .: filename: not founderrore durante l'esecuzione dei test su Travis-CI.
Adrien Joly,

49
$ls -l `which sh`
/bin/sh -> dash

$sudo dpkg-reconfigure dash #Select "no" when you're asked
[...]

$ls -l `which sh`
/bin/sh -> bash

Quindi andrà bene


Bello! Gestisco server RHEL e Ubuntu e ho sempre piccoli problemi come questo con Ubuntu. Mi piacciono molto RHEL e RHEL come Linux.
Radtek,

La risposta accettata non funziona su Ubuntu 14, questa funziona!
Rohithpr,

Per favore aggiungi qualche ulteriore spiegazione alla tua risposta - che cosa fa? dpkg-reconfigurepotrebbe non essere accessibile a tutti gli utenti, specialmente su sistemi che non sono basati su Debian
Nico Haase

Risolti i miei source: not founderrori con i vecchi client telnet dopo l'aggiornamento di debian, grazie.
bjoster


9

Questo problema si verifica perché jenkins Execute Shell esegue lo script tramite il suo / bin / sh

Di conseguenza, / bin / sh non conosce "source"

Devi solo aggiungere la riga in basso nella parte superiore di Execute Shell in jenkins

#!/bin/bash

La domanda data non è collegata a Jenkins dopo tutto
Nico Haase,

8

Il sourcecomando è incorporato in alcune shell. Se si dispone di uno script, è necessario specificare quale shell utilizzare sulla prima riga, ad esempio:

#!/bin/bash

Bene, dice #! / Bin / sh e su un altro Linux se inserisco manualmente sh e chiedo "quale sorgente" mi dice: fonte: comando incorporato shell
Milad

oh, ecco a cosa serviva questa linea. Mi sono sempre chiesto. grazie mille!
CommonSenseCode

5

Ho riscontrato questo errore mentre cercavo di chiamare il comando source da #Jenkins esegui la shell.

source profile.txt o source profile.properties

La sostituzione del comando sorgente è di usare,

. ./profile.txt o . ./profile.properties

Nota: c'è uno spazio tra i due punti (.)


0

Ho trovato in un Makefile gnu su Ubuntu, (dove / bin / sh -> bash)

Avevo bisogno di usare il. comando, oltre a specificare lo script di destinazione con un prefisso ./ (vedi esempio sotto)

il sorgente non ha funzionato in questo caso, non so perché perché dovrebbe chiamare / bin / bash ..

Anche la mia variabile di ambiente SHELL è impostata su / bin / bash

test:
    $(shell . ./my_script)

Nota questo esempio non include il carattere di tabulazione; ha dovuto formattare per lo scambio di stack.


0

source è un comando incorporato bash, quindi per eseguire il comando source, puoi accedere come Root.

sudo -s source ./filename.sh


Questa non sembra una soluzione valida. Cosa succede se l'utente non dispone delle autorizzazioni sudo? E i contenuti forniti sono disponibili solo come utenti amministratori, il che causerà nuovi problemi
Nico Haase,

0

Su Ubuntu, invece di usare sh scriptname.sh per eseguire il file, l'ho usato. scriptname.sh e ha funzionato! La prima riga del mio file contiene: #!/bin/bash

utilizzare questo comando per eseguire lo script

.name_of_script.sh

1
Questa è già stata risolta più volte. Fornisci ulteriori informazioni se aggiungi una nuova risposta in tal caso
Nico Haase,

-3

Questo può aiutarti, stavo ottenendo questo errore perché stavo cercando di ricaricare il mio .profilecon il comando . .profilee aveva un errore di sintassi


-6

Bourne shell (sh) usa PATH per localizzare source <file>. Se il file che stai cercando di trovare non è nel tuo percorso, viene visualizzato l'errore "file non trovato".

Provare:

source ./<filename>

5
Il post dice di sh: 1: source: not foundnofile not found
Cristian Chaparro A.
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.