Používám git bash na Windows. Chci spustit ls příkaz s bash . Mohu spustit ls samostatně takto:
$ ls
f1 f2
Nicméně, když to zkusím s bash , dostávám chybu:
$ bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
Ale když vytvořím svůj skript, funguje to dobře:
$ echo "echo [email protected]" > my.sh && bash my.sh
V čem může být problém?
Přijatá odpověď:
Z podrobného manuálu pro bash(1) :
ARGUMENTY
Pokud po zpracování možnosti zůstanou argumenty a nebyla zadána volba -c ani
-s, předpokládá se, že první argument je
název souboru obsahující příkazy shellu.
Má ls obsahují příkazy shellu? Ne, je to binární soubor. bash kvílí o této skutečnosti a selhává.
strace může pomoci ukázat, co se děje:
$ strace -o alog bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
alog soubor může být trochu chaotický, ale zobrazuje bash hledáte ls v aktuálním pracovním adresáři – bezpečnostní riziko, pokud někdo umístil nezbedné ls soubor někde! — a pak provede PATH hledat:
$ 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
Proč by to mohlo být bezpečnostní riziko, pokud spustíte bash somecmd ze špatného adresáře, kde někdo vytvořil ls (nebo nějaký jiný známý příkaz kvůli chybě ve skriptu):
$ echo "echo rm -rf /" > ls
$ bash ls
rm -rf /
$