El primer argumento después sh -c inline-script
va a $0
(que también se usa para mensajes de error), y el resto entra $1
, $2
...
$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg
Entonces quieres:
sh -c 'find "$1"' sh /tmp
(en los viejos tiempos, podías encontrar sh
implementaciones donde entró el primer argumento $1
, así que harías:
sh -c 'find "$1"' /tmp /tmp
O:
sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2
para tener en cuenta ambos comportamientos, pero esos depósitos han desaparecido ahora que POSIX es frecuente y está disponible públicamente).
Si desea establecer $1
, $2
en un ámbito local dentro del shell actual, allí es donde usaría las funciones. En conchas tipo Bourne:
my_func() {
find "$1"
}
my_func /tmp
Algunos shells admiten funciones anónimas. Ese es el caso de zsh
:
(){find "$1"} /tmp
O es
:
@{find $1} /tmp
Para cambiar los parámetros posicionales actuales, de forma permanente, la sintaxis depende del shell. dchirikov ya ha cubierto el Bourne como conchas (Bourne, Korn bash
, zsh
, POSIX, ash
, yash
...).
La sintaxis es:
set arg1 arg2 ... argn
Sin embargo, necesitas:
set --
Para vaciar esa lista (o shift "$#"
) y
set -- -foo
establecer $1
algo que comience con -
o +
, por lo que es un buen hábito usar siempre set --
especialmente cuando se usan datos arbitrarios, como set -- "$@" other-arg
agregar argumentos al final de la lista de parámetros posicionales.
En shells de la csh
familia ( csh
, tcsh
), asigna a la argv
matriz:
set argv=(arg1 arg2)
En los depósitos de la rc
familia ( rc
, es
, akanga
), a la *
matriz:
*=(arg1 arg2)
Aunque también puede asignar elementos individualmente:
2=arg2
En fish
, los parámetros posicionales están en la argv
matriz solamente (sin $1
, $@
allí):
set argv arg1 arg2
En zsh
, por compatibilidad con csh
, también puede asignar a la argv
matriz:
argv=(arg1 arg2)
argv[4]=arg4
Y también puedes hacer:
5=arg5
Eso significa que también puedes hacer cosas como:
argv+=(another-arg)
para agregar un argumento al final, y:
argv[-1]=()
argv[2]=()
para eliminar un argumento del final o del medio, lo que no puede hacer fácilmente con otros shells.
(find $1) /tmp
es un error de sintaxis En realidad(any-command) more-arguments
es un error de sintaxis. ¿Puedes explicar de manera diferente lo que estás tratando de hacer?