Por que o echo $$ retorna um número?

6

Por que a execução de echo $$ em bash retorna um número como 7190 , enquanto a execução de echo $ retorna apenas $ ?

    
por NerdOfLinux 07.08.2017 / 19:06

3 respostas

17

Convenção.

$$ : expande para o ID do processo do shell. No subshell a (), ele se expande para o ID do processo do shell de chamada, não para o subshell (veja o link para o manual abaixo).

rinzwind@schijfwereld:~$ echo $$
3244
rinzwind@schijfwereld:~$ ps -ef |grep 3244
rinzwind  3244  3237  0 19:06 pts/0    00:00:00 /bin/bash

Muito útil ao codificar software. E isso pode ser usado como uma maneira bruta ( mktemp seria o melhor método) de criar arquivos temporários

1 $ não tem um significado especial, por isso, você terá o que o eco sempre faz: retorná-lo.

Existe uma página de manual dedicada a isso (3.4.2 Especial Parâmetros).

    
por Rinzwind 07.08.2017 / 19:08
11

No bash para indicar usando uma variável, usamos $ , usando $$ com o primeiro cifrão, estamos dizendo que eu quero usar uma variável e usando a segunda, estamos dizendo que o nome dessa variável é na verdade, um $ . Na verdade, é uma convenção de nomenclatura e essa variável contém o ID do processo do shell atual.

Como você pediu nos comentários com $$$$ , você está retornando o mesmo id de processo duas vezes.

Existem outras variáveis também (em aqui ) :

% bl0ck_qu0te%     
por Ravexina 07.08.2017 / 19:13
1

Aqui está uma aplicação da vida real de $$ tirada de Temporizador de Tela de Bloqueio :

# Check if lock screen timer already running
pID=$(pgrep -f "${0##*/}") # All PIDs matching lock-screen-timer name
PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy ($$$)
if [ "$PREVIOUS" != "" ]; then
    kill "$PREVIOUS"
    rm ~/.lock-screen-timer-remaining
    zenity --info --title="Lock screen timer already running" --text="Previous lock screen timer has been terminated."
fi

Neste trecho de código, a linha:

PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy 

usa o processo atual em execução ( $$ ) para removê-lo (indicado por não -v ) da lista de todos os processos em execução com o mesmo nome ( lock-screen-timer neste caso).

Se houver uma cópia em execução anterior, o código a elimina e exclui o arquivo de trabalho que estava sendo usado.

    
por WinEunuuchs2Unix 07.08.2017 / 19:53

Tags