Estoy usando git bash en Windows Quiero ejecutar ls comando con bash . Puedo ejecutar ls por separado así:
$ ls
f1 f2
Sin embargo, cuando intento con bash , me sale el error:
$ bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
Pero si creo mi script, funciona bien:
$ echo "echo [email protected]" > my.sh && bash my.sh
¿Cuál puede ser el problema?
Respuesta aceptada:
Del excelente manual para bash(1) :
ARGUMENTOS
Si quedan argumentos después del procesamiento de la opción, y no se ha proporcionado la opción -c ni
-s, se supone que el primer argumento es el
nombre de un archivo que contiene comandos de shell.
Hace ls contienen comandos de shell? No, es un archivo binario. bash grazna sobre este hecho y falla.
Una strace puede ayudar a mostrar lo que está pasando:
$ strace -o alog bash ls
/usr/bin/ls: /usr/bin/ls: cannot execute binary file
El alog El archivo puede complicarse un poco, pero muestra bash buscando ls en el directorio de trabajo actual:un riesgo de seguridad si alguien ha colocado un ls travieso archivo en alguna parte! y luego hace un PATH buscar:
$ 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
En cuanto a por qué esto podría ser un riesgo de seguridad, si ejecuta bash somecmd desde el directorio equivocado donde alguien ha creado un ls (o algún otro comando conocido debido a un error en un script):
$ echo "echo rm -rf /" > ls
$ bash ls
rm -rf /
$