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 usar el tiempo).
Tengo curiosidad por saber qué $$
es realmente y por qué se sugeriría como una forma de generar nombres de archivo únicos.
$$
es el ID de proceso (PID) en bash. Usar$$
es una mala idea, porque generalmente creará una condición de carrera y permitirá que un atacante subvierta su script de shell. Vea, por ejemplo, todas estas personas que crearon archivos temporales inseguros y tuvieron que emitir avisos de seguridad.En cambio, use
mktemp
. La página de manual de Linux para mktemp es excelente. Aquí hay un código de ejemplo:fuente
mktemp
opción-t
ahora está en desuso (creo que debido a problemas con el carácter-
). Usamktemp ${tempfoo}.XXXXXX
estos días . Me tomo la libertad de actualizar tu publicación.TMPFILE=$(mktemp)
.$$ es la identificación del proceso actual.
fuente
Cada proceso en un sistema operativo tipo UNIX tiene un identificador único (temporalmente), el PID. No hay dos procesos que se ejecuten al mismo tiempo que puedan tener el mismo PID, y $$ se refiere al PID de la instancia de bash que ejecuta el script.
Esto es mucho no es un identificador único en el sentido de que nunca se reutilizará (de hecho, los PID se reutilizan constantemente). Lo que sí te da es un número tal que, si otra persona ejecuta tu script, obtendrá un identificador diferente mientras el tuyo aún se está ejecutando. Una vez que el suyo muere, el PID puede reciclarse y otra persona puede ejecutar su script, obtener el mismo PID y obtener el mismo nombre de archivo.
Como tal, es realmente sensato decir "$$ da un nombre de archivo tal que si alguien más ejecuta el mismo script mientras mi instancia todavía se está ejecutando, obtendrá un nombre diferente".
fuente
$$ es tu 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.
Por lo general, crearía algo como / tmp / myprogramname $$
Hay muchas maneras de romper esto, y si está escribiendo en ubicaciones a las que otras personas pueden escribir, no es demasiado difícil en muchos sistemas operativos predecir qué PID tendrá y perder el tiempo: imagine que está ejecutando como root y creo / tmp / yourprogname13395 como un enlace simbólico que apunta a / etc / passwd, y usted escribe en él.
Esto es algo malo en un script de shell. Si va a usar un archivo temporal para algo, debería estar usando un lenguaje mejor 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.
fuente
$$ es el pid del proceso de shell actual. No es una buena forma de generar nombres de archivo únicos.
fuente
$$ 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 envuelve, y después de que salga, eventualmente habrá otro proceso con el mismo pid. Mientras esté en ejecución, el pid es exclusivo 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 usar, 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:
fuente
Es la identificación del proceso del proceso bash. Ningún proceso concurrente tendrá el mismo PID.
fuente
$$ es la identificación de proceso del shell en el que se ejecuta el script. Para obtener más detalles, consulte la página de manual de sh o bash. Las páginas de manual se pueden encontrar utilizando una línea de comando "man sh" o buscando en la web "página de manual de shell"
fuente
Déjame la segunda respuesta de emk: no uses $$ por sí mismo como algo "único". Para archivos, use mktemp. Para otras ID dentro de la misma secuencia de comandos bash, use "$$$ (fecha +% s% N)" para una posibilidad razonablemente única de unicidad.
fuente
fuente