Mensaje de error 'fuente: no encontrado' al ejecutar un script

35

Estoy creando un pequeño script de configuración automatizado que se modificará /etc/profiley $HOME/.profilesi algunas rutas no se exportan. Entonces, me gustaría volver a cargarlos automáticamente.

He leído que sourcehace esto, así que encendí mi terminal e ingresé:

source /etc/profile
source ~/.profile

Desde la terminal, no produjo ningún error.

Sin embargo, poner estos dos comandos dentro del script Bash da como resultado source: not found.

  1. ¿Cómo puedo estar seguro de que Bash ejecuta el script, incluso si #!/bin/shse especifica (aparentemente, no lo garantiza)?
  2. ¿Por qué diría que estas dos fuentes no se pueden encontrar cuando están allí sin lugar a dudas?
Yanick Rochon
fuente

Respuestas:

54

/bin/shno es bash. Para ejecutar su script con bash, escriba #!/bin/bashcomo la primera línea en su script.

El error source: not foundno se descarta porque /etc/profileno se encuentra. Se cae, porque sourceno se encuentra. sourcees una función integrada de Bash, y no ejecuta el script con bash. Entonces está claro por qué no se encuentra. Cambie la #!línea en el guión y funcionará.

caos
fuente
9

1. ¿Cómo puedo estar seguro de que Bash ejecuta el script, incluso si #!/bin/shestá especificado (aparentemente, no lo garantiza)?

Para asegurarse de que Bash ejecuta un script escrito para shshell (como en su caso, vea ¿Cuál es la diferencia entre #! / Bin / sh y #! / Bin / bash? ), Simplemente ejecute el siguiente comando:

bash script_name

Por lo tanto, ya no obtendrá ese error.

2. ¿Por qué diría que estas dos fuentes no se pueden encontrar cuando están allí sin lugar a dudas?

No dice que esos archivos de origen no están allí. Dice que sourceno se encuentra el comando. Esto es normal, porque desde que comienza su secuencia de comandos con la #!/bin/shlínea, su secuencia de comandos se ejecutará utilizando shy no bashcomo puede pensar. ¿Por qué es normal? Porque el sourcecomando es un Bash incorporado, pero no un shincorporado. Para obtener un archivo sh, debe usar .(punto). Ejemplo:

. /etc/profile
. ~/.profile

Otra forma es cambiar la línea shebang a #!/bin/bashcomo dijo el caos en su respuesta .

Radu Rădeanu
fuente
4

Vea esta pregunta SO :

/bin/shPor lo general, es otro shell que intenta imitar The Shell. Muchas distribuciones usan /bin/bashpara sh, es compatible con la fuente. En Ubuntu, sin embargo, /bin/dashse usa que no es compatible con la fuente. Si no puede editar el script, intente cambiar el shell que lo ejecuta.

muru
fuente
1

Algunos proyectiles soportan en .lugar de source. Entonces puedes probar algo como esto

. filename

en lugar de

source filename

Espero que funcione

Shivam Agrawal
fuente