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

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

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