¿Por qué la fuente da un error "no se puede ejecutar el archivo binario"

10

Tengo un pequeño archivo que inicializa una tmuxsesión y luego crea algunas ventanas. Después de algunas depuraciones y ajustes, las cosas funcionaron bien hasta que cambié el nombre del archivo de texto (con los tmuxcomandos) de spama xset:

$ source xset
bash: source: /usr/bin/xset: cannot execute binary file

Ahora he cambiado el nombre del archivo y source spamfunciona de nuevo, pero me pregunto por qué es esto. El archivo está en mi directorio de inicio, y no en /usr/bin.

Shawn
fuente
Hay un binario llamado xset. Tratar source ./xset.
Faheem Mitha

Respuestas:

11

la bashfuente del comando interno, primero busca el nombre de archivo en PATH, a menos que haya una barra ( /) en el nombre de archivo. xsetes un archivo ejecutable en su RUTA, de ahí el problema.

Puede ejecutar source ./xseto cambiar la opción sourcepath a off con:

shopt -u sourcepath

Desde la bashpágina del manual:

      source filename [arguments]
          Read and execute commands from filename  in  the  current  shell
          environment  and return the exit status of the last command exe
          cuted from filename.  If filename does not contain a slash, file
          names  in  PATH  are used to find the directory containing file
          name.  The file searched for in PATH  need  not  be  executable.
          When  bash  is  not  in  posix  mode,  the  current directory is
          searched if no file is found in PATH.  If the sourcepath  option
          to  the  shopt  builtin  command  is turned off, the PATH is not
          searched.  If any arguments are supplied, they become the  posi
          tional  parameters  when  filename  is  executed.  Otherwise the
          positional parameters are unchanged.  The return status  is  the
          status  of  the  last  command exited within the script (0 if no
          commands are executed), and false if filename is  not  found  or
          cannot be read.
Anthon
fuente
5

El sourcecomando :

Lea y ejecute comandos del argumento del nombre de archivo en el contexto actual del shell. Si el nombre del archivo no contiene una barra oblicua, la PATHvariable se usa para buscar el nombre del archivo .

POSIX define. este comportamiento (para su alias) . ¿Por qué? Bueno, puede poner scripts de configuración fuente PATHy acceder a ellos sin una ruta calificada. Para acceder al archivo que desea, proporcione una ruta absoluta o relativa en su lugar:

source ./xset
source ~/xset
source /home/shawn/xset

Todo lo anterior funcionará como esperaba inicialmente. También puede deshabilitar sourcepathcon shopt.

Michael Homer
fuente