Ответ 1
В Bash $$
есть идентификатор процесса, как отмечено в комментариях, небезопасно использовать в качестве имени файла temp по разным причинам.
Для временных имен файлов используйте команду mktemp
.
Однажды я прочитал, что одним из способов получить уникальное имя файла в оболочке для временных файлов было использование знака с двойным долларом ($$
). Это приводит к количеству, которое время от времени меняется... но если вы его вызываете повторно, он возвращает тот же номер. (Решение состоит в том, чтобы просто использовать время.)
Мне любопытно узнать, что на самом деле есть $$
, и почему это было бы предложено как способ генерации уникальных имен файлов.
В Bash $$
есть идентификатор процесса, как отмечено в комментариях, небезопасно использовать в качестве имени файла temp по разным причинам.
Для временных имен файлов используйте команду mktemp
.
$$
- это идентификатор процесса (PID) в bash. Использование $$
- плохая идея, потому что она обычно создает условие гонки и позволяет вашему shell-script быть подорванным злоумышленником. См., Например, все эти люди, которые создали небезопасные временные файлы и должны были выносить рекомендации по безопасности.
Вместо этого используйте mktemp
. Персональная страница Linux для mktemp превосходна. Вот пример кода из него:
tempfoo=`basename $0`
TMPFILE=`mktemp -t ${tempfoo}` || exit 1
echo "program output" >> $TMPFILE
$$ - это идентификатор текущего процесса.
Каждый процесс в UNIX-подобной операционной системе имеет (временно) уникальный идентификатор PID. Ни один из двух процессов, работающих одновременно, не может иметь один и тот же PID, а $$ относится к PID экземпляра bash, запускающего script.
Это не очень уникальный идентификатор в том смысле, что он никогда не будет повторно использован (действительно, PID повторно используются повторно). То, что он дает вам, - это число, в котором, если другой человек запускает ваш script, он получит другой идентификатор, пока ваш будет работать. После того, как вы умрете, PID может быть переработана, а кто-то другой может запустить ваш script, получить тот же PID и получить одинаковое имя файла.
Как таковой, только в действительности разумно сказать: "$$ дает имя файла, так что если кто-то другой запускает тот же самый script whist, мой экземпляр все еще запущен, они получат другое имя".
$$ - ваш PID. Он действительно не создает уникальное имя файла, если вы не будете осторожны, и никто другой не делает это точно так же.
Как правило, вы должны создать что-то вроде /tmp/myprogramname $$
Есть так много способов сломать это, и если вы пишете места, другие люди могут писать ему не слишком сложно во многих операционных системах, чтобы предсказать, какой PID у вас будет, и закрутить - представьте себе 'запускается как root, и я создаю /tmp/yourprogname 13395 как символическую ссылку, указывающую на /etc/passwd, и вы записываете в нее.
Это плохо, что нужно делать в оболочке script. Если вы собираетесь использовать временный файл для чего-то, вы должны использовать лучший язык, который, по крайней мере, позволит вам добавить "эксклюзивный" флаг для открытия (создания) файла. Тогда вы можете быть уверены, что вы не сбиваете что-то еще.
$$ - это pid текущего процесса оболочки. Это не хороший способ генерации уникальных имен файлов.
Идентификатор процесса bash. Никакие параллельные процессы никогда не будут иметь одинаковый PID.
$$ - это идентификатор процесса оболочки, в которой работает ваш script. Для получения дополнительной информации см. Справочную страницу для sh или bash. Страницы руководства можно найти либо с помощью командной строки "man sh", либо путем поиска в Интернете "man-страницы оболочки"
$$ - это pid (идентификатор процесса) интерпретатора оболочки, запускающий ваш script. Это различно для каждого процесса, запущенного в системе на данный момент, но со временем pid обертывается вокруг, и после того, как вы выйдете, в конечном итоге произойдет еще один процесс с таким же pid. Пока вы работаете, pid уникален для вас.
Из приведенного выше определения должно быть очевидно, что независимо от того, сколько раз вы используете $$ в script, он вернет тот же номер.
Вы можете использовать, например. /tmp/myscript.scratch.$$ как ваш временный файл для вещей, которые не должны быть чрезвычайно надежными или безопасными. Рекомендуется удалить такие временные файлы в конце вашего script, используя, например, команду trap:
trap "echo 'Cleanup in progress'; rm -r $TMP_DIR" EXIT
Позвольте мне ответить на второй emk - не используйте $$ сами по себе как "уникальные". Для файлов используйте mktemp. Для других идентификаторов в одном и том же bash script используйте "$$$ (date +% s% N)" для достаточно хорошей вероятности уникальности.
-k