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?

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á.


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 .


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.


1

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

. filename

en lugar de

source filename

Espero que funcione

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.