it-swarm-pt.tech

O que significa $$ no shell?

Uma vez eu li que uma maneira de obter um nome de arquivo exclusivo em um shell para arquivos temporários era usar um cifrão duplo ($$). Isso produz um número que varia de tempos em tempos ... mas se você chamar repetidamente, ele retorna o mesmo número. (A solução é apenas usar o tempo.)

Estou curioso para saber o que $$ realmente é e por que seria sugerido como uma forma de gerar nomes de arquivos exclusivos.

125
Kitty

Em Bash, $$ é o ID do processo, como observado nos comentários, não é seguro usar como nome de arquivo temporário por vários motivos.

Para nomes de arquivos temporários, use o comando mktemp.

85
Joe Skora

$$ é o ID do processo (PID) no bash. O uso de $$ é uma má ideia, porque geralmente ele cria uma condição de corrida e permite que seu script Shell seja subvertido por um invasor. Veja, por exemplo, todas essas pessoas que criaram arquivos temporários inseguros e tiveram que emitir avisos de segurança.

Em vez disso, use mktemp. A man page do Linux para o mktemp é excelente. Aqui está um exemplo de código:

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

$$ é o id do processo atual.

17
Flint

Todo processo em um sistema operacional semelhante ao UNIX possui um identificador (temporariamente) exclusivo, o PID. Nenhum dos dois processos em execução ao mesmo tempo pode ter o mesmo PID e $$ refere-se ao PID da instância do bash que executa o script.

Isso é muito não um idenificador único no sentido de que nunca será reutilizado (na verdade, os PIDs são reutilizados constantemente). O que ele oferece é um número tal que, se outra pessoa executar seu script, ele receberá um identificador diferente enquanto o seu ainda estiver em execução. Uma vez que o seu morre, o PID pode ser reciclado e outra pessoa pode executar seu script, obter o mesmo PID e obter o mesmo nome de arquivo.

Como tal, é apenas sensato dizer que "$ $ dá um nome de arquivo tal que se alguém executar o mesmo script enquanto minha instância ainda estiver em execução, ele terá um nome diferente".

6
Adam Wright

$$ é o seu PID. Ele não gera realmente um nome de arquivo exclusivo, a menos que você seja cuidadoso e ninguém mais o faça exatamente da mesma maneira. 

Normalmente você criaria algo como/tmp/myprogramname $$

Existem tantas maneiras de quebrar isso, e se você está escrevendo para locais que outras pessoas podem escrever, não é muito difícil em muitos sistemas operacionais prever o que o PID vai ter e transar - imagine que você está executando como root e eu crio/tmp/yourprogname13395 como um link simbólico apontando para/etc/passwd - e você escreve nele.

Isso é uma coisa ruim para se fazer em um script Shell. Se você estiver indo para usar um arquivo temporário para algo, você deveria estar usando uma linguagem melhor que, pelo menos, permitirá que você adicione o sinalizador "exclusivo" para abrir (criar) o arquivo. Então você pode ter certeza de que não está atingindo outra coisa.

4
JBB

Deixe-me a segunda resposta do emk - não use $$ por si só como algo "único". Para arquivos, use mktemp. Para outros IDs dentro do mesmo script bash, use "$$$ (date +% s% N)" para uma razoavelmente boa chance de exclusividade.

 -k
2
Kevin Little

$$ é o pid do atual processo do Shell. Não é uma boa maneira de gerar nomes de arquivos exclusivos.

2
leif

O $$ é o ID do processo do Shell no qual seu script está sendo executado. Para mais detalhes, veja a man page de sh ou bash. As man pages podem ser encontradas usando uma linha de comando "man sh" ou pesquisando na web "Shell manpage"

2
Shannon Nelson

É o ID do processo do processo bash. Nenhum processo concorrente terá o mesmo PID.

1
Chris

$$ é o pid (id do processo) do interpretador do Shell executando seu script. É diferente para cada processo em execução em um sistema no momento, mas com o tempo o pid se envolve, e depois que você sair, haverá outro processo com o mesmo pid eventualmente. Enquanto você estiver executando, o pid é exclusivo para você.

A partir da definição acima, deve ficar óbvio que, não importa quantas vezes você use $$ em um script, ele retornará o mesmo número. 

Você pode usar, por exemplo /tmp/myscript.scratch.$$ como seu arquivo temporário para coisas que não precisam ser extremamente confiáveis ​​ou seguras. É uma boa prática excluir esses arquivos temporários no final do script, usando, por exemplo, o comando trap:

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

Além disso, você pode pegar o nome de usuário de login através deste comando. Por exemplo.

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