Я пытаюсь вызвать систему из программы cpp с помощью следующей команды
system("ln -s -t \"targetDir[0]\" \"baseDir[0]\"");
И targetDir, и baseDir являются QStringList. Программа компилируется и запускается, но когда я выполняю команду, я получаю сообщение об ошибке ln: targetDir [0] — недопустимая команда. Когда я тестирую путем жесткого кодирования значений вместо использования переменных, это работает просто отлично. Я могу только заключить, что это не экранирование строки для помещения значения переменных в аргумент, передаваемый в ln. По жизни я не могу понять, почему нет.
Есть идеи?
Ты смущен. Система (3) функция библиотеки (это не команда, и, несмотря на ее имя не системный вызов, те перечислены в Системные вызовы (2)) является разветвление /bin/sh -c
процесс, который, очевидно, не имеет никакого представления о переменных вашей программы на C ++ (во время выполнения переменные не существуют; существуют только местоположения).
Кстати, используя Система (3) без осторожности может быть опасным из-за внедрение кода проблемы. Вообразите в своем (неправильном) подходе, что targetDir[0]
содержит что-то вроде foo; rm -rf $HOME
….
Чтобы сделать символическую ссылку, разветвление процесса — это излишне. Просто позвони символическая (2) системный вызов (который п (1) Команда будет вызываться, если вызывается как ln -s
)
Библиотека Qt предлагает QFile класс с его QFile :: ссылка функция-член или статический QFile :: ссылка (оба позвонят символическая (2))
Будущие (или недавние) версии C ++, начиная с C ++ 17, обеспечит std::filesystem::create_symlink
функция (который на Linux будет называть
символическая (2)). Это, вероятно, вдохновлено Повысить файловую систему библиотека.
PS. Если кодирование для Linux или POSIX, я рекомендую прочитать Расширенное программирование в Linux (который можно загрузить бесплатно). Но если вы хотите переносимую исходную программу Qt, ограничьте себя щедрым Qt API. Или принять C ++ 17 и использовать его std::filesystem
вещь.
C ++ ни в коем случае не выполняет интерполяцию строк.
Если вы на самом деле пишете на C ++, вы можете (учитывая targetDir
является char **
или что-то похожее)
std::string command = std::string("ln -s -t \"") + targetDir[0] + "\" \"" + baseDir[0] + "\"";
system(command.c_str());