Estás interpretando mal la página del manual. En primer lugar, la parte sobre --
señalar el final de las opciones es irrelevante para lo que intentas hacer. A -c
partir de ese momento, anula el resto de la línea de comando, de modo que ya no pasa por el manejo de opciones de bash, lo que significa que pasará --
al comando, no se manejará por bash como un marcador de fin de opciones.
El segundo error es que los argumentos adicionales se asignan como parámetros posicionales al proceso de shell que se inicia, no se pasan como argumentos al comando. Entonces, lo que está tratando de hacer podría hacerse como uno de:
/bin/bash -c 'echo "$0" "$1"' foo bar
/bin/bash -c 'echo "$@"' bash foo bar
En el primer caso, pasar echo los parámetros $0
y $1
explícitamente, y en el segundo caso, usar "$@"
para expandir tan normal como "todos los parámetros posicionales excepto $ 0". Tenga en cuenta que en ese caso también tenemos que pasar algo para ser utilizado $0
; Elegí "bash" porque eso es lo $0
que normalmente sería, pero cualquier otra cosa funcionaría.
En cuanto a la razón por la que se hace de esta manera, en vez de pasar los argumentos que dan directamente a la orden que la lista: nota de que la documentación dice "comando s se leen de cadena", en plural. En otras palabras, este esquema le permite hacer:
/bin/bash -c 'mkdir "$1"; cd "$1"; touch "$2"' bash dir file
Pero, tenga en cuenta que una mejor manera de alcanzar su objetivo original podría ser usar en env
lugar de bash
:
/usr/bin/env -- "ls" "-l"
Si no necesita ninguna de las funciones que proporciona un shell, no hay razón para usarla; env
en este caso, el uso será más rápido, más simple y menos tipeo. Y no tiene que pensar tanto para asegurarse de que manejará de forma segura los nombres de archivo que contienen metacaracteres de shell o espacios en blanco.