set
es un intérprete de comandos de shell , utilizado para establecer y desarmar opciones de shell y parámetros posicionales.
Sin argumentos, set
imprimirá todas las variables de shell (tanto las variables de entorno como las variables en la sesión actual) ordenadas en el entorno local actual .
También puedes leer la documentación de bash .
Hay algunas advertencias.
set "$var"
asignará var
valor a $1
. Si $var
comienza con -
o +
, entonces el $var
contenido se trató como secuencias de opciones de shell. Si $var
contiene alguna opción no válida, la mayoría de los shells POSIX imprimirán el error. yash
y , zsh
en la emulación, no solo se imprime el error, sino que también se configuran opciones válidas. Mientras deja de configurar las opciones en la primera opción no válida, las asignará todas. En :sh
ksh
yash
zsh
yash
var=-fxd; set "$var"
f
y x
se presentará en $-
, mientras:
var=fdx; set "$var"
solo f
presente en $-
. En ambos casos, f
y x
se presentará $-
con zsh
in sh
y ksh
emulación.
Para protegerte de esa situación, puedes pasar --
como primer argumento para establecer el parámetro posicional incluso si comienza con -
o +
:
var=-fdx; set -- "$var"
asignará $var
a $1
, independientemente de su contenido.
set --
sin ningún otro argumento se desarmará todos los parámetros posicionales.
Si el primer argumento es -
, el comportamiento no está especificado. Todos los shells POSIX conocidos se desarmarán x
y las v
opciones (excepto posh
), y asignarán cualquier cosa después -
a los parámetros posicionales:
set -xv - -f
asignará -f
a $1
. set -
tampoco desarmó parámetros posicionales. Schily Osh también se comportó así. Heirloom sh no desarma v
y x
opciones.
La única excepción de shell POSIX es yash
, que se trata -
como el primer parámetro posicional:
$ yash -c 'set -xv - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
+ printf %s\n - -f
-
-f
+ printf %s\n cvx
cvx
Schily incluso no hace nada si está -
presente en los argumentos:
$ schily-sh -c 'set -v - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
<blank line>
s
$ schily-sh -c 'set -v -- -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
-f
vs