Недавно я решил начать учить себя C++ и думал, что простой проект шифрования будет хорошим началом, поскольку он охватывает большинство основ (cout, cin, файлы открытия и т.д.). Есть ли способ, чтобы код открыл окно терминала, подобное тому, которое было открыто при компиляции и запуске из возвышенного текста?
Я пробовал это до сих пор, но ничего не изменил.
string cmd = "gnome-terminal-x sh-c 'ls-l; exec bash'";
system(cmd.c_str());
По сути, я хотел бы иметь возможность запускать программу, нажав на.exe, и иметь терминал, где всплывают все входные и выходные данные.
Вам не нужно писать какой-либо код, вам просто нужно настроить ярлык для запуска программы в терминале. Здесь диалог Gnome, который показывает эту опцию:
Проблема кажется gnome-terminal
, или просто моя неудача дать ему правильные аргументы. Например, gnome-terminal -x sh -c 'ls -l; exec bash'
gnome-terminal -x sh -c 'ls -l; exec bash'
из командной строки в другом терминале просто открывает пустой терминал gnome и выдает кучу предупреждений glib на исходный терминал... (Примечание для читателей: если вы можете дать правильную команду, которая работает на gnome-terminal
, пожалуйста, дайте мне знать в комментариях или просто отредактируйте этот параграф.)
Однако использование xterm
работает, например, xterm -e sh -c 'ls -l; exec bash'
xterm -e sh -c 'ls -l; exec bash'
или строка для вашего кода:
string cmd = "xterm -e sh -c 'ls -l; exec bash'";
В качестве побочного примечания, команда открытия x-терминального окна по умолчанию для DE является x-terminal-emulator
, но довольно часто имеет практическую проблему с различными терминалами, использующими разные аргументы, так что, к сожалению, вы, вероятно, лучше используете конкретный терминал, такой как xterm
, и требующий установки или позволяющий пользователю настроить какой терминал использовать, с какими аргументами (хотя позволяя пользователю указывать любую команду для запуска, также может быть угрозой безопасности, если пользователь не всегда доверял).
Просто будьте очень осторожны с побегом. Например, при тестировании в командной строке команду формы, а затем скопировать и вставить его в C++ строка символов, вам нужно бежать каждый "
и \
еще один раз для C++. Если у вас есть проблемы с этим, проверить C++ 11 необработанных строк.
Escaping становится особенно важным, если вы строит командную строку во время выполнения, и особенно если вы принимаете ввод пользователя и добавляете его в строку. В этом случае лучше искать и использовать какую-либо существующую библиотеку, например GLib, или очень тщательно деактивировать ввод пользователя (т.е. Просто параноидально отклонять что-либо с символами, что может иметь особое значение в оболочке в некотором контексте).
Если вы действительно спрашиваете, как моя программа может открыть консольное окно для себя аналогично тому, как ведут себя консольные программы Windows, и перенаправить его собственные stdin
, stdout
и stderr
там, как если бы он был запущен из командной строки, это не очень просто из одного и того же двоичного файла, и обычно это не делается в Unix.
Если вы хотите подобное поведение, вы можете создать ярлык на рабочем столе, но более общим способом является создание сценария оболочки оболочки, который запускает ваш двоичный файл в терминале. Какой именно сценарий точно зависит от того, как вы хотите, чтобы он вел себя точно: что он будет делать с stdio, вернется ли он или ждет выхода программы, как вы хотите, чтобы он нашел двоичный файл, как он себя ведет при запуске вместо двойной -c лизать из графического интерфейса и т.д.
ls
из своей программы. Он хочет, чтобы стандартный ввод и вывод его собственной программы шел на недавно открытый терминал. Он пытается использовать sh
и ls
и прочее не потому, что они ему действительно нужны, а потому, что он не знает, что использовать.