Как запустить программу на C/C++ с помощью контекстного меню (опция правой кнопки мыши)

Я хочу изучать C/C++. Здесь мое требование не использовать какую-либо IDE. Я хочу запустить мою программу на C / C++ следующим образом,

  1. Я напишу "Cpp1.cpp" //, который напечатает "Hello World".
  2. Сохраните файл и закройте.
  3. Щелкните правой кнопкой мыши файл "Cpp1.cpp".
  4. В опциях меню правой кнопки мыши у меня должна быть кнопка "Запустить C++".

После выполнения вышеуказанных 4 шагов в окне терминала должны появиться выходные данные или ошибки.

Я пытался сделать это, используя скрипт Nautilus, но он потерпел неудачу после нескольких испытаний.

Пожалуйста, смотрите скриншот (который не работает так, как я ожидаю).

Эталонное изображение

Я пытаюсь сделать, как показано ниже, проверьте здесь

2 ответа

Решение

1. Создайте файл скрипта Nautilus и сделайте его исполняемым:

touch "$HOME/.local/share/nautilus/scripts/MyC++Run"
chmod +x "$HOME/.local/share/nautilus/scripts/MyC++Run"

2. Вот содержание скрипта. Он создает вспомогательный (автоматически удаляемый) скрипт, который выполняется в новом gnome-терминале, поэтому вы можете увидеть сообщения об ошибках в окне терминала:

#!/bin/bash -e

# Get the list of the selected in Nautilus items as an array $ITEM_LIST
IFS_BAK=$IFS
IFS=$'\t\n'
ITEM_LIST=($NAUTILUS_SCRIPT_SELECTED_FILE_PATHS)
IFS=$IFS_BAK

# Create aux script, that compile and execute the program. Run the script in gnome-terminal
compile_and_exec_program() {
        OUT="${DIR}/${NAME}.out"              # Define the name of the output file
        AUX="${DIR}/${NAME}.bash"             # Define the name of the aux script
        printf '#!/bin/bash -e\n' > "${AUX}"  # Create the auxiliary script
        printf '%s "%s" "%s" && "%s"\n' "${1}" "${OUT}" "${item}" "${OUT}" >> "${AUX}"
        printf 'rm -f "%s"\nexec bash' "${AUX}" >> "${AUX}"
        chmod +x "${AUX}"                     # Make the aux script exec and run it
        nohup gnome-terminal -x sh -c "$(echo \'"${AUX}"\')" >/dev/null 2>&1 &
}

# For each selected item: get its name, location, etc. and proceed...
for item in "${ITEM_LIST[@]}"; do

        ITEM="$(basename "${item}")"          # Get the item name (exclude the path)
        DIR="$(dirname "${item}")"            # Get the path to the item (exclude the name)
        NAME="${ITEM%.*}"                     # Get the name (exclude the extension)
        EXT="${ITEM##*.}"                     # Get the extension (exclude the name)

        # If the item is a file and its extension is `c` or `cpp`, then compile and execute
        if [ -f "$item" ]; then
                if   [ "$EXT" == "c" ];   then compile_and_exec_program "gcc -o"
                elif [ "$EXT" == "cpp" ]; then compile_and_exec_program "g++ -o"
                else notify-send "Wrong extension of the selected file: $ITEM"
                fi
        else
                notify-send "The selected item is a directory: $ITEM"
        fi
done
  • Дополнительные пояснения: использование вспомогательного скрипта - это самый надежный способ запуска более чем одной команды в новом терминале gnome, который я нашел, когда делал один из моих ответов.

    В зависимости от входных параметров функции compile_and_exec_program содержание сгенерированного printf раздел, вспомогательный скрипт будет похож на:

    #!/bin/bash -e
    g++ -o /work/dir/project.cpp /work/dir/output.out && /work/dir/project.out
    rm -f /work/dir/project.bash
    exec bash
    

    куда && означает (как обычно), если команда, которая находится на левой стороне, успешно выполнена, то выполнить команду, которая находится на правой стороне. Линия rm -f /work/dir/project.bash удалит сам вспомогательный скрипт Последняя строка exec bash намеревается оставить открытым новое окно терминала gnome.

    Эта часть $(echo \'"${AUX}"\') намеревается напечатать одинарные кавычки вокруг имени вспомогательного сценария. Это важно, когда имя скрипта содержит некоторые специальные символы. Я не мог найти другой способ сделать это. Другой способ указать только пробелы - это использовать: ${AUX/\ /\\ },

  • Вот пример сценария, который создает файлы журналов, где вы можете увидеть сообщения об ошибках процесса.

3. Вот демонстрация (из предыдущей версии) возможностей скрипта:

У вас есть базовое недопонимание в отношении программирования на C/C++: это не сценарии, интерпретируемые во время выполнения. Вместо этого эти программы должны быть скомпилированы и преобразованы в работоспособные программы.

Предполагая, что имя вашего файла Cpp1.cpp, тогда вам нужно будет выполнить следующий терминал:

gcc -o Cpp1 Cpp1.cpp

Результирующий вывод, Cpp1 будет исполняемым двоичным файлом, который можно запустить с помощью команды ./Cpp1 Обратите внимание, что в этом случае эту программу нельзя запустить, щелкнув по ней правой кнопкой мыши: она не имеет никаких знаний об открытии окон и их использовании.

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