Что $$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