¿Qué hace el comando set sin argumentos?

22

¿Qué hace el setcomando sin argumentos?

Como puedo ver, imprime mis variables de entorno al igual que el envcomando pero en orden alfabético. Y además imprime información diferente (¿variables? ¿Funciones?) Como:

__git_printf_supports_v=yes
__grub_script_check_program=grub-script-check
...
quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local quoted;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}

¿Qué es y de dónde viene?

No puedo encontrar información sobre el setcomando sin argumentos. En realidad no tengo manpágina para setmi distribución de Linux en absoluto.

Aleksandr Kovalev
fuente
1
"Esta construcción es tan complicada que merece su propia sección". Ver los documentos
galath

Respuestas:

17

set es un shell incorporado que muestra todas las variables de shell, no solo las de entorno, y también las funciones de shell, que es lo que está viendo al final de la lista.

Las variables se muestran con una sintaxis que les permite establecerse cuando las líneas se ejecutan o se obtienen.

De bash la página del manual :

Si no se proporcionan opciones o argumentos, set muestra los nombres y valores de todas las variables y funciones de shell, ordenadas según la configuración regional actual, en un formato que puede reutilizarse como entrada para establecer o restablecer las variables establecidas actualmente.

En diferentes capas, el comportamiento no es necesariamente el mismo; por ejemplo, ksh setno muestra funciones de shell.

jlliagre
fuente
3
Esto se debe a kshque no almacena la definición de función en la variable de shell.
Cuonglm
2
@cuonglm ¡Una sabia decisión de diseño hecha por dgk! ;-)
jlliagre
7

Como settiene salida y which setno devuelve nada, sabes que es parte del shell que estás utilizando, probablemente bash.

man bash lo menciona muchas veces, pero es más fácil vincularlo en la documentación en línea .

Esta construcción es tan complicada que merece su propia sección. set le permite cambiar los valores de las opciones de shell y establecer los parámetros posicionales, o mostrar los nombres y valores de las variables de shell.

set tiene la especificación de llamada de:

set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]

así que si quieres encontrarlo en man en la línea de comando puedes buscar con

/set.*abef
usuario1133275
fuente
which setDepende de tu caparazón. Al menos zshlo informará por usted. También puede leer esto para más detalles.
Cuonglm
Es poco probable que la pregunta sea sobre algo más que bash, ya que tiene un gran dominio del mercado, y cualquiera que use el shell no predeterminado no necesitaría hacer esta pregunta.
user1133275
6

setes un intérprete de comandos de shell , utilizado para establecer y desarmar opciones de shell y parámetros posicionales.

Sin argumentos, setimprimirá 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á varvalor a $1. Si $varcomienza con -o +, entonces el $varcontenido se trató como secuencias de opciones de shell. Si $varcontiene alguna opción no válida, la mayoría de los shells POSIX imprimirán el error. yashy , zshen 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 :shkshyashzshyash

var=-fxd; set "$var"

fy xse presentará en $-, mientras:

var=fdx; set "$var"

solo fpresente en $-. En ambos casos, fy xse presentará $-con zshin shy kshemulació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á $vara $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 xy las vopciones (excepto posh), y asignarán cualquier cosa después -a los parámetros posicionales:

set -xv - -f

asignará -fa $1. set -tampoco desarmó parámetros posicionales. Schily Osh también se comportó así. Heirloom sh no desarma vy xopciones.

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
Cuonglm
fuente
Nunca entiendo por qué la gente enlazar a cualquier lugar, pero la primera ... que le gustaría hablar de la diferencia entre set -- $unset, set - $unset, set $unsety, set "$unset"y así sucesivamente - por lo general aquellas discrepancias que conseguir que la gente en ese tipo de problemas en primer lugar.
mikeserv
@mikeserv: Bueno, agregué más detalles, pero no entendí a qué te refieres cuando lo usé $unset.
Cuonglm
@cuonglm El comando set $unsetactuará exactamente igual que setpara una variable no establecida. Pero set "$unset" lo hará notar, si en unsetrealidad es una variable no establecida. A set - $unsetelimina -vy -xestablece las opciones (en bash).
@BinaryZebra: Ah, por supuesto, para mí, es mejor usarlo unset_var. Y también tenga en cuenta que en set "$unset"realidad está configurado $1como vacío. Se trata de la expansión de shell, no estrictamente set, así que no lo menciono.
Cuonglm
1
@mikeserv: El comportamiento de poshy yashson diferentes cuando -aparecen. Puedes leer mi actualización (y no dudes en mejorarla).
Cuonglm
2

Si está trabajando dentro de un shell bash, escriba help set.

Al final de la ayuda impresa, lea:

Si no se proporcionan ARG, se imprimen todas las variables de shell.

Entonces, un no argumentos setimprime todas las variables conocidas por el shell.


fuente
Me pregunto si set -x; setsería útil
ILMostro_7