Что $$FOO делает в bash (в пакете deb, собранном с epm)?

В командной строке я получаю это:

$ FOO=foo
$ echo $FOO
foo
$ echo $$FOO
11971FOO

Здесь $$ разрешается в PID оболочки, как и ожидалось, и "FOO" печатается дословно.

Теперь, пытаясь понять и отладить некоторые сценарии, я нахожу следующее:

#!/bin/bash
FILE1=/path/to/file/1
FILE2=/path/to/file/2
echo $$FILE1 >> $$FILE2

Рассматриваемый сценарий происходит от сценария postinstall пакета Debian. Это должно пройти предварительную обработку, прежде чем он сможет работать?

Обновление: скрипт является частью пакета, созданного с помощью epm и читаемого с помощью следующей директивы:

%postinstall <script.sh

В итоговом пакете deb скрипт postinst выглядит так:

#!/bin/bash
FILE1=/path/to/file/1
FILE2=/path/to/file/2
echo $FILE1 >> $FILE2

Таким образом, обработка выполняется либо epm, либо dpkg.

2 ответа

Решение

Это, очевидно, особенность упаковочного инструмента EPM. Цитирование документации:

Обратите внимание, что все команды, указанные в файле списка, будут использовать расширение переменных, предоставляемое EPM, поэтому обязательно указывайте любые символы знака доллара ($) в ваших командах. Например, "$foo" заменяется значением "foo", но "$$ foo" становится "$foo".

$$ печатает идентификатор процесса, который 11971 в твоем случае.

Так как у вас есть FOO после этого echo просто сваливает FOO после 11971 так что вы получите

11971FOO

Если быть точным, то это идентификатор процесса оболочки bash, в которой вы запускаете сеанс. Чтобы убедиться в этом, вы можете сделать:

kill -9 11971

который завершит текущую сессию. Ниже скрипт в обычных случаях

#!/bin/bash
FILE1=/path/to/file/1
FILE2=/path/to/file/2
echo $$FILE1 >> $$FILE2

не будет подвергаться какой-либо предварительной обработке. Он продолжит добавлять файл

current_shell_process_id_FILE2

в текущем каталоге с содержанием

current_shell_process_idFILE1
Другие вопросы по тегам