Interpretación de mensajes de error

Interpretación de mensajes de error

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/messagesser 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 . filefunciona:

Si fileno contiene una <barra diagonal>, el shell utilizará la ruta de búsqueda especificada por PATHpara 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 messagestodavía significa /usr/bin/messages, no la función.

La línea relevante debe ser . ./messageso . /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-sourceo file-to-run, los directorios enumerados en la variable de entorno $PATHse 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-sourceo ./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 lsen 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.

información relacionada