Почему echo $$ возвращает число?

6

Почему запуск echo $$ в bash возвращает число, подобное 7190 , а при запуске echo $ возвращает $ ?

    
задан NerdOfLinux 07.08.2017 в 19:06
источник

3 ответа

17

Конвенция.

$$ : расширяется до идентификатора процесса оболочки. В подстроке () она расширяется до идентификатора процесса вызывающей оболочки, а не подоболочки (см. Ссылку на руководство ниже).

[email protected]:~$ echo $$
3244
[email protected]:~$ ps -ef |grep 3244
rinzwind  3244  3237  0 19:06 pts/0    00:00:00 /bin/bash

Очень полезно при программировании программного обеспечения. И он может использоваться как грубый ( mktemp будет лучшим способом) способ создания временных файлов

1 $ не имеет особого значения, поэтому он дает вам то, что всегда делает эхо: верните его.

Существует справочная страница , посвященная этому (3.4.2 Special Параметры).

    
ответ дан Rinzwind 07.08.2017 в 19:08
источник
11

В bash для использования переменной используется $ , используя $$ с первым знаком доллара, мы говорим, что я хочу использовать переменную и используя вторую, мы говорим, что имя этой переменной фактически $ . это на самом деле соглашение об именах, и эта переменная содержит идентификатор процесса текущей оболочки.

Как вы просили в комментариях с $$$$ , вы дважды возвращаете один и тот же идентификатор процесса.

Существуют и другие переменные (из здесь )

  • $1, $2, $3, ... are the positional parameters.
  • "[email protected]" is an array-like construct of all positional parameters, {$1, $2, $3 ...}.
  • "$*" is the IFS expansion of all positional parameters, $1 $2 $3 ....
  • $# is the number of positional parameters.
  • $- current options set for the shell.
  • $$ pid of the current shell (not subshell).
  • $_ most recent parameter (or the abs path of the command to start the current shell immediately after startup).
  • $IFS is the (input) field separator.
  • $? is the most recent foreground pipeline exit status.
  • $! is the PID of the most recent background command.
  • $0 is the name of the shell or shell script.
    
ответ дан Ravexina 07.08.2017 в 19:13
1

Вот реальное приложение $$ , взятое из Блокировать таймер экрана :

# 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

В этом фрагменте кода строка:

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

использует текущий текущий процесс ( $$ ), чтобы удалить его (обозначенный не -v ) из списка всех процессов, работающих под тем же именем ( lock-screen-timer в этом случае).

Если была предыдущая скопированная копия, код убивает ее и удаляет рабочий файл, который он использовал.

    
ответ дан WinEunuuchs2Unix 07.08.2017 в 19:53