Warum gibt die Quelle den Fehler "Binärdatei kann nicht ausgeführt werden" aus

10

Ich habe eine kleine Datei, die eine tmuxSitzung initialisiert und dann einige Fenster erstellt. Nach einigem Debuggen und Optimieren funktionierten die Dinge einwandfrei, bis ich die Textdatei (mit den tmuxBefehlen) von umbenannte spamin xset:

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

Ich habe die Datei jetzt wieder umbenannt und source spamarbeite wieder, aber ich frage mich, warum das so ist. Die Datei befindet sich in meinem Home-Verzeichnis und nicht in /usr/bin.

Shawn
quelle
Es wird eine Binärdatei aufgerufen xset. Versuchen Sie es source ./xset.
Faheem Mitha

Antworten:

11

Die bashinterne Befehlsquelle sucht zuerst in PATH nach dem Dateinamen, es sei denn, der Dateiname enthält einen Schrägstrich ( /). xsetist eine ausführbare Datei in Ihrem PATH, daher das Problem.

Sie können source ./xsetdie Quellpfadoption entweder ausführen oder ändern:

shopt -u sourcepath

Von der bashManpage:

      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
quelle
5

Der sourceBefehl wird :

Lesen und Ausführen von Befehlen aus dem Dateinamenargument im aktuellen Shell-Kontext. Wenn der Dateiname keinen Schrägstrich enthält, wird die PATHVariable zum Suchen des Dateinamens verwendet .

Dieses Verhalten wird (für .seinen Alias) von POSIX definiert . Warum? Nun, Sie können beschaffbare Konfigurationsskripte einfügen PATHund ohne qualifizierten Pfad darauf zugreifen. Geben Sie stattdessen einen absoluten oder relativen Pfad an, um auf die gewünschte Datei zuzugreifen:

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

Alle oben genannten Funktionen funktionieren wie ursprünglich erwartet. Sie können auch deaktivieren sourcepathmit shopt.

Michael Homer
quelle