Предотвратить расширение 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 вар

Я закончил тем, что использовал этот метод — и он работал отлично.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]