Я прочитал это: Остановить расширение подстановочного знака в оболочке? и тому подобное — это не двойной вопрос.
Я имею дело с набором устаревшего кода 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 на уровне ОС (с помощью любых флагов, измененных файлов и т. Д. — я с удовольствием изменю любые файлы на коробке, если это необходимо).
В интересах закрытия цикла, так как Слава не опубликовал ответ … Скопировано из его комментария:
Вы можете создать общую библиотеку со своими
system()
функция и добавить егоLD_PRELOAD
вар
Я закончил тем, что использовал этот метод — и он работал отлично.
Других решений пока нет …