A veces es necesario emular y verificar las variables anteriores en pequeños ejemplos y luego se puede copiar de inmediato a algún script, etc.
Traté de resolver usando un ejemplo simple de las siguientes maneras:
(find $1) /tmp
sh -c '(find $1) /tmp'
sh -c "find $1" /tmp
echo '(find $1) /tmp' | sh
y con otras combinaciones. También experimentó agregando la directiva del intérprete shebang #!/bin/sh -x
, pero no obtuvo el resultado deseado.
¿Puedo hacer esto simplemente?
(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?rc
familia (rc
,es
,akanga
...), donde en ese caso que es equivalente afind $1 /tmp
.Respuestas:
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
...Entonces quieres:
(en los viejos tiempos, podías encontrar
sh
implementaciones donde entró el primer argumento$1
, así que harías:O:
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:Algunos shells admiten funciones anónimas. Ese es el caso de
zsh
:O
es
: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:
Sin embargo, necesitas:
Para vaciar esa lista (o
shift "$#"
) yestablecer
$1
algo que comience con-
o+
, por lo que es un buen hábito usar siempreset --
especialmente cuando se usan datos arbitrarios, comoset -- "$@" other-arg
agregar argumentos al final de la lista de parámetros posicionales.En shells de la
csh
familia (csh
,tcsh
), asigna a laargv
matriz:En los depósitos de la
rc
familia (rc
,es
,akanga
), a la*
matriz:Aunque también puede asignar elementos individualmente:
En
fish
, los parámetros posicionales están en laargv
matriz solamente (sin$1
,$@
allí):En
zsh
, por compatibilidad concsh
, también puede asignar a laargv
matriz:Y también puedes hacer:
Eso significa que también puedes hacer cosas como:
para agregar un argumento al final, y:
para eliminar un argumento del final o del medio, lo que no puede hacer fácilmente con otros shells.
fuente
es lo que necesitas:
fuente