Ich verwende git bash unter Windows. Ich möchte ls ausführen Befehl mit bash . Ich kann ls ausführen separat so:
$ ls
f1 f2
Wenn ich es jedoch mit bash versuche , erhalte ich den Fehler:
$ bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
Aber wenn ich mein Skript erstelle, funktioniert es gut:
$ echo "echo [email protected]" > my.sh && bash my.sh
Was kann das Problem sein?
Akzeptierte Antwort:
Aus dem feinen Handbuch für bash(1) :
ARGUMENTE
Wenn Argumente nach der Optionsverarbeitung verbleiben und weder die Option -c noch die Option
-s angegeben wurde, wird angenommen, dass das erste Argument der
Name einer Datei
Hat ls enthalten Shell-Befehle? Nein, es ist eine Binärdatei. bash krächzt über diese Tatsache und scheitert.
Eine strace kann helfen zu zeigen, was vor sich geht:
$ strace -o alog bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
Der alog Datei kann etwas chaotisch werden, zeigt aber bash Suche nach ls im aktuellen Arbeitsverzeichnis – ein Sicherheitsrisiko, wenn jemand ein ungezogenes ls platziert hat Datei irgendwo! – und macht dann einen PATH Suche:
$ grep ls alog
execve("/usr/bin/bash", ["bash", "ls"], [/* 43 vars */]) = 0
open("ls", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/ls", 0x7fff349810f0) = -1 ENOENT (No such file or directory)
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", X_OK) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", R_OK) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", X_OK) = 0
stat("/usr/bin/ls", {st_mode=S_IFREG|0755, st_size=117672, ...}) = 0
access("/usr/bin/ls", R_OK) = 0
open("/usr/bin/ls", O_RDONLY) = 3
Warum dies ein Sicherheitsrisiko darstellen könnte, wenn Sie bash somecmd ausführen aus dem falschen Verzeichnis, in dem jemand ein ls erstellt hat (oder ein anderer bekannter Befehl aufgrund eines Fehlers in einem Skript):
$ echo "echo rm -rf /" > ls
$ bash ls
rm -rf /
$