tag definicion body shell scripting

shell - definicion - ¿Qué significa $$ en el caparazón?



title tag html (11)

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.

Una vez leí que una manera 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 llamas repetidamente, devuelve el mismo número. (La solución es simplemente usar el tiempo).

Tengo curiosidad por saber qué es $$ realidad, y por qué sería sugerido como una forma de generar nombres de archivo únicos.


$$ es el pid (id. de proceso) del intérprete de shell que ejecuta su script. En este momento, es diferente para cada proceso que se ejecuta en un sistema, pero con el tiempo el pid se ajusta, y luego de que salga habrá otro proceso con el mismo pid eventualmente. Mientras se esté ejecutando, 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 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, usando, por ejemplo, el comando trap:

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


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


$$ es la identificación del proceso actual.


$$ es la identificación del proceso del shell en el que se está ejecutando el script. Para obtener más detalles, consulte la página de manual de sh o bash. Las páginas man se pueden encontrar usando una línea de comando "man sh", o buscando en la web "shell manpage"


$$ es tu PID. En realidad, 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 estás escribiendo en lugares donde otras personas pueden escribir, no es demasiado difícil en muchos sistemas operativos predecir qué PID vas a tener y atornillar: imagina que estás corriendo. como root y yo creamos / tmp / yourprogname13395 como un enlace simbólico que apunta a / etc / passwd - y usted escribe en él.

Esto es algo malo de hacer en un script de shell. Si vas a usar un archivo temporal para algo, deberías estar usando un lenguaje mejor que al menos te permita agregar el indicador "exclusivo" para abrir (crear) el archivo. Entonces puedes estar seguro de que no estás peleando con otra cosa.


Cada proceso en un sistema operativo como UNIX tiene un identificador único (temporalmente), el PID. No hay dos procesos ejecutándose al mismo tiempo que puedan tener el mismo PID, y $$ se refiere al PID de la instancia de bash que ejecuta el script.

Esto no es un identificador único en el sentido de que nunca será reutilizado (de hecho, los PID se reutilizan constantemente). Lo que sí le proporciona es un número tal que, si otra persona ejecuta su secuencia de comandos, obtendrá un identificador diferente mientras que el suyo todavía se está ejecutando. Una vez que el tuyo fallezca, el PID se puede reciclar y otra persona podría ejecutar tu secuencia de comandos, 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 guión cuando mi instancia aún se está ejecutando, obtendrá un nombre diferente".


Déjame que emita la respuesta de emk: no uses $$ por sí mismo como algo "único". Para archivos, use mktemp. Para otras ID dentro del mismo script bash, use "$$$ (date +% s% N)" para una posibilidad razonablemente buena de unicidad.

-k


En Bash $$ es la identificación del proceso, como se señala 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 .


Es la identificación del proceso del proceso bash. Ningún proceso simultáneo tendrá el mismo PID.


$$ 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 atacante altere tu guión de shell. Ver, por ejemplo, a todas estas personas que crearon archivos temporales inseguros y tuvieron que emitir avisos de seguridad.

En su lugar, use mktemp . La página man de Linux para mktemp es excelente. Aquí hay algunos ejemplos de código:

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