Оболочка вызывает ошибку ссылки на переменную в запросе

Флаг O _EXCL, используемый в сочетании с флагом O _CREAT, означает, что если файл уже существует, вызов openзавершится ошибкой. Если файл не существует, будет предпринята попытка его создать и открыть.

Одним из способов использования этого является создание простого файла блокировки. Если несколько процессов попытаются открыть один и тот же файл с флагами O _CREAT и O _EXCL, один из них завершится успешно, а остальные потерпят неудачу. Конечно, если файл уже существует, например, из-за того, что предыдущий процесс завершился без удаления файла, ни одна из последующих попыток не увенчается успехом, так что это не самый надежный способ управления блокировкой.

Другим применением является создание файла для записи, в который процесс не будет записывать никакой другой процесс. Вы можете использовать это, если вы создаете файл в /tmp, где множество других процессов создают файлы с похожими, возможно, идентичными именами. Функция mkstempв glibc вызывает openс флагами O _CREAT и O _EXCL.

Unix/Linux не записывает создателя файла (может быть создана контрольная запись, если ОС поддерживает это.)

0
15.12.2020, 23:19
1 ответ

В строке с двойными кавычками

"select DATE(COLLECTTIME) DATE,count(distinct COLLECTTIME) as record_count FROM `${project_id}.Test_INGEST.${test_tablename}` where DATE(collecttime) >= '2020-12-01' group by DATE order by DATE asc;"

секция

`${project_id}.Test_INGEST.${test_tablename}`

интерпретируется оболочкой как подстановка команды. Это происходит потому, что обратные кавычки вводят подстановку команд, когда они встречаются без кавычек или, как здесь, внутри строк с двойными кавычками. Оболочка расширит переменные внутри обратных кавычек и попытается выполнить результат как команду, как если бы она сказала

$(${project_id}.Test_INGEST.${test_tablename})

Вывод, полученный при выполнении команды в пределах `...`или $(...), затем заменит подстановку команды, по крайней мере, если это было сделано намеренно с командой, которая имела смысл. В вашем случае обратные кавычки являются частью синтаксиса базы данных и должны передаваться как буквальные обратные кавычки, чтобы оболочка не пыталась делать с ними свое дело.

Если вы хотите, чтобы обратные кавычки были буквальными, рассмотрите возможность их цитирования:

"select DATE(COLLECTTIME) DATE,count(distinct COLLECTTIME) as record_count FROM \`$project_id.Test_INGEST.$test_tablename\` where DATE(collecttime) >= '2020-12-01' group by DATE order by DATE asc;"

Я также удалил ненужные фигурные скобки вокруг имен переменных.

В идеале вы также должны очищать значения переменных перед их внедрением в базу данных. Вы должны, как минимум, обнаруживать и отклонять строки, содержащие обратные кавычки.

Также обратите внимание, что код, который вы показываете, не устанавливает значение для переменной project_id(, поэтому эта часть строки перед .Test_INGESTпуста в сообщении об ошибке ).

2
18.03.2021, 22:42

Теги

Похожие вопросы