En mis scripts tengo una función llamada messages
. Lo escribí en Linux Mint, sin problemas al ejecutarlo, y cuando lo moví a una estación Debian Buster, la función entra en conflicto con /usr/bin/messages
.
Tengo un script de inicio que llama al script messages
:
script_inicio
# call to messages script
. messages
mensajes
messages() {
# reformat the arguments and return them
}
más tarde en startup_script
messages "This is a message"
que arroja
./startup_script: line 35: .: /usr/bin/messages: cannot execute binary file
messages: could not open mailbox `/path/to/my/script/<string passed to my function>': No such file or directory
Entonces recibo un montón de errores relacionados con /usr/bin/messages
ser llamado en lugar de mi función.
Después de agregar type messages "This is a message"
, el resultado relevante es:
messages is /usr/bin/messages
Tengo la opción de cambiar el nombre de mi función¹, pero tal vez haya una mejor manera de manejar esta situación.
¿Cómo le digo a mi script que ignore los binarios del sistema y use mis propias funciones?
¹ La función se llama en varios scripts, muchas veces, por lo que no es la opción más fácil simplemente cambiar el nombre.
Respuesta1
Así es como . file
funciona:
Si
file
no contiene una <barra diagonal>, el shell utilizará la ruta de búsqueda especificada porPATH
para encontrar el directorio que contiene el archivo.
Este comportamiento esespecificado por POSIX.
Tu primer error es
./startup_script: line 35: .: /usr/bin/messages: cannot execute binary file
Es similar cuando llamas . echo
:
-bash: .: /bin/echo: cannot execute binary file
Estás intentando obtener el archivo binario /usr/bin/messages
. De hecho, su archivo donde está definida la función no tiene ningún origen, la función no está definida en el script actual. Esto significa que más tarde messages
todavía significa /usr/bin/messages
, no la función.
La línea relevante debe ser . ./messages
o . /full/path/to/messages
(es decir, ruta asuarchivo, no al binario).
Respuesta2
Interpretación de mensajes de error
Mire el número de línea en el mensaje de error.. De esa forma sabrás en qué línea está el error. Eso se nos ocultó, ya que nos mostró algunas líneas de un guión que contiene más de 35 líneas.
Qué archivo se ejecuta.
Cuando especifica un archivo con . file-to-source
o file-to-run
, los directorios enumerados en la variable de entorno $PATH
se buscan de izquierda a derecha. El directorio actual no está en esta lista, ya que puede suponer un riesgo para la seguridad, o al menos generar confusión. Ejecuta un programa en el directorio actual. Debe especificar que está en el directorio actual. por ejemplo, . ./file-to-source
o ./file-to-run
(no es necesario indicar la ruta completa).
Los Unix solían tener .
en la RUTA, hasta que se dio cuenta de que esto era un problema. Por ejemplo, coloque un programa llamado ls
en el directorio actual. CMD en Windows de Microsoft todavía está .
implícito en PATH
, no puede eliminarlo. Es una de las causas del alto contenido de software comercial en este sistema operativo.
Un problema
.
se refiere al directorio de trabajo actual, no al directorio en el que se encuentra el script.
Para solucionarlo, se puede hacer algo como esto.
(
cd "$(dirname "$(readlink -f "$0")")"
script_dir="$(pwd)"
)
script_dir/other_script
Esperemos que alguien pueda vincularse a una mejor solución.