web-development-kb-es.site

¿Qué significa $$ en la cáscara?

Una vez leí que una forma de obtener un nombre de archivo único en un Shell para archivos temporales era usar un signo de dólar doble ($$). Esto produce un número que varía de vez en cuando ... pero si lo llama repetidamente, devuelve el mismo número. (La solución es simplemente usar el tiempo.)

Tengo curiosidad por saber qué es realmente $$, y por qué se lo sugeriría como una forma de generar nombres de archivo únicos.

130
Kitty

En Bash $$ está el identificador del proceso, como se indica en los comentarios, no es seguro usarlo como un nombre de archivo temporal por una variedad de razones.

Para nombres de archivos temporales, use el comando mktemp.

88
Joe Skora

$$ es el ID de proceso (PID) en bash. Usar $$ es una mala idea, ya que generalmente creará una condición de carrera y permitirá que un script de shell sea subvertido por un atacante. Ver, por ejemplo, todas estas personas quienes crearon archivos temporales inseguros y tuvieron que emitir avisos de seguridad.

En su lugar, use mktemp. La página de manual de Linux para mktemp es excelente. Aquí hay un código de ejemplo de él:

tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo "program output" >> $TMPFILE
107
emk

$$ es el id del proceso actual.

17
Flint

Cada proceso en un sistema operativo similar a UNIX tiene un identificador único (temporalmente), el PID. Ningún proceso que se ejecute al mismo tiempo puede tener el mismo PID, y $$ se refiere al PID de la instancia de bash que ejecuta el script.

Esto es mucho no un identificador único en el sentido de que nunca se reutilizará (de hecho, los PID se reutilizan constantemente). Lo que le da es un número tal que, si otra persona ejecuta su script, obtendrá un identificador diferente mientras el suyo aún se está ejecutando. Una vez que el suyo muere, el PID puede ser reciclado y alguien más puede ejecutar su script, obtener el mismo PID y, por lo tanto, obtener el mismo nombre de archivo.

Como tal, solo es realmente sensato decir que "$$ da un nombre de archivo tal que si alguien más ejecuta el mismo script mientras mi instancia todavía se está ejecutando, obtendrán un nombre diferente".

6
Adam Wright

$$ es su PID. Realmente no genera un nombre de archivo único, a menos que tenga cuidado y nadie más lo haga exactamente de la misma manera.

Normalmente, crearías algo como/tmp/myprogramname $$

Hay muchas maneras de romper esto, y si escribes en ubicaciones a las que otras personas pueden escribir, en muchos sistemas operativos no es demasiado difícil predecir qué PID vas a tener y echar a perder - imagina que estás corriendo como root y creo/tmp/yourprogname13395 como un enlace simbólico que apunta a/etc/passwd - y escribes en él.

Esto es algo malo de hacer en un script de Shell. Si va a usar un archivo temporal para algo, debería usar un mejor idioma que al menos le permita agregar la bandera "exclusiva" para abrir (crear) el archivo. Entonces puedes estar seguro de que no estás golpeando otra cosa.

4
JBB

Permítame la segunda respuesta de emk: no use $$ por sí mismo como algo "único". Para archivos, use mktemp. Para otras identificaciones dentro del mismo script de bash, use "$$$ (fecha +% s% N)" para una razonablemente buena probabilidad de singularidad.

 -k
2
Kevin Little

$$ es el pid del proceso Shell actual. No es una buena manera de generar nombres de archivo únicos.

2
leif

El $$ es el identificador de proceso del Shell en el que se ejecuta el script. Para más detalles, vea la página del manual de sh o bash. Las páginas del manual se pueden encontrar usando la línea de comando "man sh" o buscando en la web "Shell manpage"

2
Shannon Nelson

Es el ID de proceso del proceso de bash. Ningún proceso concurrente tendrá el mismo PID.

1
Chris

$$ es el pid (id de proceso) del intérprete de Shell que ejecuta su script. Es diferente para cada proceso que se ejecuta en un sistema en este momento, pero con el tiempo el pid se ajusta, y después de que salga habrá otro proceso con el mismo pid eventualmente. Mientras esté ejecutando, el pid es único para usted.

De la definición anterior, debería ser obvio que no importa cuántas veces use $$ en un script, devolverá el mismo número.

Puede utilizar, por ejemplo, /tmp/myscript.scratch.$$ como su archivo temporal para cosas que no necesitan ser extremadamente confiables o seguras. Es una buena práctica eliminar dichos archivos temporales al final de su script, utilizando, por ejemplo, el comando trap:

trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT
1
Arkadiy

Además, puede tomar el nombre de usuario de inicio de sesión a través de este comando. P.ej.

echo $(</proc/$$/login id). After that, you need to use getent command.
0
Obivan