Предотвратить расширение wildecard с помощью вызова функции system()
Я прочитал это: остановить расширение символов подстановки оболочки? и тому подобное - это не дублирующий вопрос.
Я имею дело с набором устаревшего кода C++, из которого построен ряд двоичных файлов. Этот код использует system
Функция для выполнения сценария оболочки, передавая ему несколько аргументов. К сожалению, как оказалось, некоторые аргументы могут включать *
характер, но аргументы не экранированы должным образом. В результате, когда сценарий оболочки выполняется, *
расширяется, а это не то, что я хочу. Вот простой код, чтобы повторить проблему:
script.sh
#!/bin/bash
i=1
for var in "$@"
do
echo "$i => $var"
((i++))
done
program.cpp
#include <stdlib.h>
#include <string>
int main(int argc, char* argv[])
{
std::string command = "/tmp/sh/script.sh *";
return system(command.c_str());
}
Когда скомпилированный двоичный файл выполняется, я получаю список файлов в качестве параметров оболочки вместо звездочки:
$ ./program
1 => program
2 => program.cpp
3 => script.sh
Теперь, если я отключу расширение glob в оболочке, используя set -f
или же set -o noglob
, то вызов скрипта напрямую работает как положено:
$ set -f
$ ./script.sh *
1 => *
Однако, когда скрипт выполняется с system
это не работает:
$ set -f
$ ./program
1 => program
2 => program.cpp
3 => script.sh
Есть ли способ предотвратить расширение при выполнении команды через system
?
Я действительно хочу избежать необходимости перестраивать двоичные файлы, так как в оперативном и административном плане это будет огромный объем работы.
ОБНОВЛЕНИЕ: Как я уже упоминал, я хочу избежать любых изменений в исходном коде cpp; Я хочу просто отключить расширение glob на уровне ОС (с помощью любых флагов, измененных файлов и т. Д. - я с удовольствием изменю любые файлы на коробке, если это необходимо).
1 ответ
В интересах закрытия цикла, так как Слава не опубликовал ответ... Скопировано из его комментария:
Вы можете создать общую библиотеку со своими
system()
функция и добавить егоLD_PRELOAD
вар
Я закончил тем, что использовал этот метод - и он работал отлично.