Что означает $$ в оболочке?

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

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

Ответ 1

В Bash $$ есть идентификатор процесса, как отмечено в комментариях, небезопасно использовать в качестве имени файла temp по разным причинам.

Для временных имен файлов используйте команду mktemp.

Ответ 2

$$ - это идентификатор процесса (PID) в bash. Использование $$ - плохая идея, потому что она обычно создает условие гонки и позволяет вашему shell-script быть подорванным злоумышленником. См., Например, все эти люди, которые создали небезопасные временные файлы и должны были выносить рекомендации по безопасности.

Вместо этого используйте mktemp. Персональная страница Linux для mktemp превосходна. Вот пример кода из него:

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

Ответ 3

$$ - это идентификатор текущего процесса.

Ответ 4

Каждый процесс в UNIX-подобной операционной системе имеет (временно) уникальный идентификатор PID. Ни один из двух процессов, работающих одновременно, не может иметь один и тот же PID, а $$ относится к PID экземпляра bash, запускающего script.

Это не очень уникальный идентификатор в том смысле, что он никогда не будет повторно использован (действительно, PID повторно используются повторно). То, что он дает вам, - это число, в котором, если другой человек запускает ваш script, он получит другой идентификатор, пока ваш будет работать. После того, как вы умрете, PID может быть переработана, а кто-то другой может запустить ваш script, получить тот же PID и получить одинаковое имя файла.

Как таковой, только в действительности разумно сказать: "$$ дает имя файла, так что если кто-то другой запускает тот же самый script whist, мой экземпляр все еще запущен, они получат другое имя".

Ответ 5

$$ - ваш PID. Он действительно не создает уникальное имя файла, если вы не будете осторожны, и никто другой не делает это точно так же.

Как правило, вы должны создать что-то вроде /tmp/myprogramname $$

Есть так много способов сломать это, и если вы пишете места, другие люди могут писать ему не слишком сложно во многих операционных системах, чтобы предсказать, какой PID у вас будет, и закрутить - представьте себе 'запускается как root, и я создаю /tmp/yourprogname 13395 как символическую ссылку, указывающую на /etc/passwd, и вы записываете в нее.

Это плохо, что нужно делать в оболочке script. Если вы собираетесь использовать временный файл для чего-то, вы должны использовать лучший язык, который, по крайней мере, позволит вам добавить "эксклюзивный" флаг для открытия (создания) файла. Тогда вы можете быть уверены, что вы не сбиваете что-то еще.

Ответ 6

$$ - это pid текущего процесса оболочки. Это не хороший способ генерации уникальных имен файлов.

Ответ 7

Идентификатор процесса bash. Никакие параллельные процессы никогда не будут иметь одинаковый PID.

Ответ 8

$$ - это идентификатор процесса оболочки, в которой работает ваш script. Для получения дополнительной информации см. Справочную страницу для sh или bash. Страницы руководства можно найти либо с помощью командной строки "man sh", либо путем поиска в Интернете "man-страницы оболочки"

Ответ 9

$$ - это pid (идентификатор процесса) интерпретатора оболочки, запускающий ваш script. Это различно для каждого процесса, запущенного в системе на данный момент, но со временем pid обертывается вокруг, и после того, как вы выйдете, в конечном итоге произойдет еще один процесс с таким же pid. Пока вы работаете, pid уникален для вас.

Из приведенного выше определения должно быть очевидно, что независимо от того, сколько раз вы используете $$ в script, он вернет тот же номер.

Вы можете использовать, например. /tmp/myscript.scratch.$$ как ваш временный файл для вещей, которые не должны быть чрезвычайно надежными или безопасными. Рекомендуется удалить такие временные файлы в конце вашего script, используя, например, команду trap:

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

Ответ 10

Позвольте мне ответить на второй emk - не используйте $$ сами по себе как "уникальные". Для файлов используйте mktemp. Для других идентификаторов в одном и том же bash script используйте "$$$ (date +% s% N)" для достаточно хорошей вероятности уникальности.

 -k