man su dice:
You can use the -- argument to separate su options from the arguments
supplied to the shell.
man bash dice:
-- A -- signals the end of options and disables further option
processing. Any arguments after the -- are treated as filenames
and arguments. An argument of - is equivalent to --.
Pues bien, veamos:
[root ~] su - yuri -c 'echo "$*"' -- 1 2 3
2 3
[root ~] su - yuri -c 'echo "$*"' -- -- 1 2 3
2 3
[root ~] su - yuri -c 'echo "$*"' -- - 1 2 3
1 2 3
[root ~] su - yuri -c 'echo "$*"' - 1 2 3
1 2 3
Lo que esperaba (la salida del segundo comando difiere):
[root ~] su - yuri -c 'echo "$*"' -- 1 2 3
2 3
[root ~] su - yuri -c 'echo "$*"' -- -- 1 2 3
1 2 3
[root ~] su - yuri -c 'echo "$*"' -- - 1 2 3
1 2 3
[root ~] su - yuri -c 'echo "$*"' - 1 2 3
1 2 3
Probablemente no sea un gran problema. ¿Pero qué está pasando allí? La segunda y la tercera variantes parecen ser el camino a seguir, pero una de ellas no funciona. El cuarto parece poco confiable, -puede tratarse como suuna opción.

bash 4.2.45tanto en las cuentas de origen como en las de destino.Respuestas:
Lo que está sucediendo es que el primer argumento que proporciona al shell es el
$0parámetro, (generalmente este sería el nombre del shell). No se incluye cuando lo hace,echo $*ya que$*es cada argumento aparte de$0.Ejemplo:
Actualizar
Haciendo el siguiente comando:
rinde la línea de strace:
Entonces, de alguna manera, parece que en este caso
suestá engullendo el extra--sin pasarlo a bash, posiblemente debido a un error (o al menos un comportamiento indocumentado). Sin embargo, no comerá más de dos de los--argumentos:fuente
su - yuri -c 'echo "$*"' -- -- 1 2 3supuestamente el shell obtiene-- 1 2 3, pero solo sale2 3. ¿Tiene sentido?bash -c 'echo $*' -- 1 2 3, sale1 2 3como se esperaba.suerror.En realidad, la respuesta de @ Graeme, y su pregunta, solo hacen referencia a los efectos secundarios de cómo maneja el shell.
"$@positional $*parameters".Estos son asignados por el shell a sus argumentos al invocarlos y en cualquier momento posterior con lasetutilidad incorporada . Pueden ser llamados en cualquier momento, ya sea"$*"que divide cada posicional con el primer carácter"$IFS"o"$@"que cita cada posicional y los divide con todos"$IFS."Si ya tiene los valores que está alimentando al shell, no es necesario que lo haga
--tres veces. Los parámetros de Shell sonsetcapaces, siempre, en cualquier momento, no solo en la invocación (excepto $ 0 y -i):Y todas esas citas de shell pueden ser confusas. Esto simplifica un poco las cosas:
Los argumentos del shell principal son
set4, 5 y 6 y luego se pasan al subshell invocado porsuel posicionalparameter "$@array".Tenga en cuenta cómo uso
( subshell )el comando anterior: lo hago porque no quiero perder el tiempo con mi entorno actual de shell, porque puedo cambiar inadvertidamente algo que preferiría no hacerlo si lo hiciera conset.ACERCA DE LA REDIRECCIÓN:
En primer lugar, su sistema Unix funciona con archivos: permisos de archivo, contenido de archivo, atributos de archivo. De una forma u otra, cada objeto de datos que usa puede (y, al menos en mi opinión, debería) abordarse como un archivo. La redirección apunta a un archivo, eso es todo. A
<<HERE-DOCUMENTdescribirá un archivo en línea y luego lo redirigirá. O las expansiones de shell se interpretan o no.El autor de la pregunta señala en los comentarios a continuación que cuando intenta utilizar este método como
rootusuario, recibe un error de permisos. Cuando respondí, le sugerí élchownochgrpel/dev/fd/${num}archivo especial, pero este probablemente no sea el mejor método. La razón se encuentra con este problema esrootse concedereadpermisos pero noexecutepermisos. Puede manejar esto fácilmente evitando unaexecllamada. En lugar de invocar el/dev/fd/${num}archivo directamente en la línea de comando, haga lo siguiente:El uso de dos heredocs puede ayudar a escapar. Esto es lo que sucede en todos los casos:
NO ESTABLECIDO EN
<<HEREDOCSALIDA
SET
"$@"IN<<HEREDOCSALIDA
SET
"$@"Y MÁS EN<<HEREDOCSALIDA
fuente
"8 9\n4 5 6\n". Estoy corriendodebian 6,bash-4.1.5ysu.rootque dice:-su: /dev/fd/4: Permission denied. ¿Sabes lo que eso significa, por cierto? De lo contrario, sale como usted dice, pero no aborda la pregunta. La pregunta es sobre el uso de--y-.chown /dev/fd/4durante el tiempo que va a necesitar, o simplementechgrp. No tengo mucho tiempo para probar en este momento. Pero eso es un poco irrelevante, al igual que el otro, no necesita pasar argumentos al final de la cola, solo trabaje en su cita. ¿Vealo Ahora?suno poder trabajar con redireccionadosstdin, pasar argumentos es aún mejor que inyectarlos en el comando. Porque en el último caso necesitas escapar de ellos.