Sto usando git bash
Su Windows. Voglio eseguire ls
comando con bash
. Posso eseguire ls
separatamente in questo modo:
$ ls
f1 f2
Tuttavia, quando provo con bash
, ottengo l'errore:
$ bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
Ma se creo il mio script funziona bene:
$ echo "echo [email protected]" > my.sh && bash my.sh
Quale può essere il problema?
Risposta accettata:
Dal bel manuale per bash(1)
:
ARGOMENTI
Se gli argomenti rimangono dopo l'elaborazione dell'opzione e non è stata fornita né l'opzione -c né
-s, si presume che il primo argomento sia il
nome di un file contenente i comandi della shell.
Non ls
contengono comandi di shell? No, è un file binario. bash
gracchia su questo fatto e fallisce.
Una strace
può aiutare a mostrare cosa sta succedendo:
$ strace -o alog bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
Il alog
il file può diventare un po' disordinato, ma mostra bash
cercando ls
nella directory di lavoro corrente:un rischio per la sicurezza se qualcuno ha inserito un ls
cattivo file da qualche parte! — e poi fa un PATH
cerca:
$ 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
Quanto al motivo per cui questo potrebbe essere un rischio per la sicurezza, se esegui bash somecmd
dalla directory sbagliata in cui qualcuno ha creato un ls
(o qualche altro comando noto a causa di un bug in uno script):
$ echo "echo rm -rf /" > ls
$ bash ls
rm -rf /
$