comando de origen no encontrado en sh shell

148

Tengo un script que usa shshell. Me sale un error en la línea que usa el sourcecomando. Parece sourceque no está incluido en mi shshell.

Si intento explícitamente ejecutar sourcedesde shell obtengo:

sh: 1: source: not found

¿De alguna manera debo instalar "fuente"? ¿Tengo una versión incorrecta de sh?

Milad
fuente
1
Se podría argumentar razonablemente que un shell que admite sourcees una "versión incorrecta".
William Pursell
1
Además, el mensaje de error source: not foundsignifica que el sourcecomando se evaluó correctamente, pero el archivo que debería haber leído no existe.
Simon Richter
44
No es posible "instalar" source porque es una característica del shell. No se puede implementar como un comando externo.
Christopher Schultz

Respuestas:

152

/bin/shPor lo general, es otro shell que intenta imitar The Shell. Muchas distribuciones usan /bin/bashpara sh, es compatible source. En Ubuntu, sin embargo, /bin/dashse usa lo que no es compatible source. La mayoría de los proyectiles usan en .lugar de source. Si no puede editar el script, intente cambiar el shell que lo ejecuta.

choroba
fuente
2
¡Gracias! ¡Reemplazar / bin / sh con / bin / bash funcionó en Ubuntu! Sin embargo, tengo curiosidad por qué, ¿significa que en Ubuntu bash es sh?
Milad
1
@Milad: en Ubuntus reciente, /bin/shllamadas /bin/dash. Tradicionalmente, se /bin/shllama /bin/bashmodo de compatibilidad sh.
choroba
@Milad Creo que no funciona en ubuntu 14.04. ¿Cuál es tu versión del sistema operativo?
Reza Ameri
1
Tal vez se conozca ayuda: si tiene scripts en cascada, cambie el nombre de "sh -> bash". Gracias. :-)
BG Bruno
Desafortunadamente, no fue intuitivo para mí cómo solucionar este problema, pero me puso en el camino correcto. Tuve que agregar SHELL := /bin/basha la parte superior de mi Makefile.
anon58192932
136

En Bourne shell (sh), use el. comando para obtener un archivo

. filename
Gurú
fuente
Realmente no se me permite cambiar el script, funciona bien en un servidor redhat. Pero en ese servidor, la fuente parece estar incluida en sh
Milad
2
Si lo tiene, sourceno es estrictamente sh.
tripleee
44
Tuve este tipo de problema en Jenkins (tratando de obtener un archivo almacenado como "archivo secreto") y buscando "." El comando fue la solución.
Jan Vlcinsky
Esta debería ser la respuesta principal, ya que funcionará con sh, dash y bash.
akhan
44
Para compatibilidad con Mac OS (entorno de desarrollo) y Travis-CI (entorno de prueba), tuve que usar . ./filename. De lo contrario, obtendría un sh: 1: .: filename: not founderror al ejecutar pruebas en 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

Entonces estará bien

shlsy
fuente
¡Agradable! Estoy ejecutando servidores RHEL y Ubuntu y siempre tengo pequeños problemas como este con Ubuntu. Realmente me gusta RHEL y RHEL como Linux.
radtek
La respuesta aceptada no funciona en Ubuntu 14, ¡esta sí!
rohithpr
Agregue alguna explicación adicional a su respuesta: ¿qué hace? dpkg-reconfigurepodría no ser accesible para todos los usuarios, especialmente en sistemas que no están basados ​​en Debian
Nico Haase
Se corrigieron mis source: not founderrores con antiguos clientes de telnet después de la actualización de Debian, gracias.
Bjoster
31

La sourceconstrucción es un bashismo. Escribe esto simplemente como en su .lugar.

p.ej

. $FILE

# OR you may need to use a relative path (such as in an `npm` script):

. ./$FILE

https://wiki.ubuntu.com/DashAsBinSh#source

Travis Clarke
fuente
9

Este problema ocurre porque jenkins Execute Shell ejecuta el script a través de su / bin / sh

En consecuencia, / bin / sh no conoce "fuente"

Solo necesita agregar la línea a continuación en la parte superior de su Shell de ejecución en jenkins

#!/bin/bash
Mojtaba Yousefi
fuente
La pregunta dada no está relacionada con Jenkins después de todo
Nico Haase
8

El sourcecomando está integrado en algunos proyectiles. Si tiene un script, debe especificar qué shell usar en la primera línea, como:

#!/bin/bash
mah
fuente
Bueno, dice #! / Bin / sh y en otro linux si ingreso manualmente sh y pregunto "qué fuente" me dice: fuente: comando incorporado de shell
Milad
oh, así que para esto era esta línea. Siempre me he preguntado. ¡muchas gracias!
CommonSenseCode
5

Enfrenté este error mientras intentaba llamar al comando de origen desde #Jenkins execute shell.

source profile.txt o source profile.properties

El reemplazo para el comando fuente es usar,

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

Nota: hay un espacio entre los dos puntos (.)

GangaRam Dewasi
fuente
0

Encontré en un Makenile GNU en Ubuntu, (donde / bin / sh -> bash)

Necesitaba usar el. comando, así como especificar la secuencia de comandos de destino con un prefijo ./ (ver ejemplo a continuación)

fuente no funcionó en este caso, no estoy seguro de por qué, ya que debería estar llamando a / bin / bash ..

Mi variable de entorno SHELL también está establecida en / bin / bash

test:
    $(shell . ./my_script)

Tenga en cuenta que esta muestra no incluye el carácter de tabulación; tuvo que formatear para el intercambio de pila.

Gord espera
fuente
0

source es un comando incorporado de bash, por lo que para ejecutar el comando source, puede iniciar sesión como Root.

sudo -s source ./filename.sh

swati jain
fuente
Esto no parece una solución válida. ¿Qué pasa si el usuario no tiene permisos de sudo? Y las cosas de origen luego solo están disponibles como usuario administrador, lo que causará nuevos problemas
Nico Haase
0

En Ubuntu, en lugar de usar sh scriptname.sh para ejecutar el archivo, lo he usado. scriptname.sh y funcionó! La primera línea de mi archivo contiene: #!/bin/bash

usa este comando para ejecutar el script

.name_of_script.sh
DInfo2019
fuente
1
Esto ya ha sido respondido varias veces. Proporcione más información si agrega una nueva respuesta en tal caso
Nico Haase
-3

Esto puede ayudarlo, recibí este error porque estaba intentando volver a cargar mi .profilecon el comando . .profiley tenía un error de sintaxis

Cañón Kolob
fuente
-6

Bourne shell (sh) usa PATH para ubicarse source <file>. Si el archivo que está intentando obtener no está en su ruta, aparece el error 'archivo no encontrado'.

Tratar:

source ./<filename>
mosu
fuente
55
La publicación dice que sh: 1: source: not foundnofile not found
Cristian Chaparro A.