Pourquoi la source donne-t-elle une erreur «impossible d'exécuter le fichier binaire»

10

J'ai un petit fichier qui initialise une tmuxsession et crée ensuite des fenêtres. Après quelques débogages et modifications, les choses ont bien fonctionné jusqu'à ce que je renomme le fichier texte (avec les tmuxcommandes) de spamà xset:

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

J'ai maintenant renommé le fichier et source spamfonctionne à nouveau, mais je me demande pourquoi. Le fichier se trouve dans mon répertoire personnel et non dans /usr/bin.

Shawn
la source
Il y a un binaire appelé xset. Essayez source ./xset.
Faheem Mitha

Réponses:

11

la bashsource de commande interne, cherche d'abord le nom de fichier dans PATH, sauf s'il y a une barre oblique ( /) dans le nom de fichier. xsetest un fichier exécutable dans votre PATH, d'où le problème.

Vous pouvez soit exécuter source ./xsetsoit modifier l'option sourcepath sur off avec:

shopt -u sourcepath

Depuis la bashpage de manuel:

      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
la source
5

La sourcecommande :

Lisez et exécutez des commandes à partir de l' argument filename dans le contexte shell actuel. Si le nom de fichier ne contient pas de barre oblique, la PATHvariable est utilisée pour rechercher le nom de fichier .

Ce comportement est défini (pour ., son alias) par POSIX . Pourquoi? Eh bien, vous pouvez mettre des scripts de configuration sourcables à l'intérieur PATHet y accéder sans chemin d'accès qualifié. Pour accéder au fichier souhaité, donnez plutôt un chemin absolu ou relatif:

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

Tout ce qui précède fonctionnera comme prévu initialement. Vous pouvez également désactiver sourcepathavec shopt.

Michael Homer
la source