1

I want to learn C/C++. Here my requirement is not to use any IDE. I want to run my C/C++ program in following way,

  1. I will write "Cpp1.cpp" //which will print "Hello World".
  2. Save the file and close.
  3. Right click on the "Cpp1.cpp" file.
  4. In the right click menu options, I should have a button as "Run C++".

After following above 4 steps, output or errors should appear in the terminal window.

I tried to do using Nautilus script, but it failed miserably after multiple trials.

Please see the screenshot (which is not working the way that I am expecting).

Reference image

I am trying to do like below, check here

  • If you are starting to learn c/c++ this should not be where to start .. actually AskUbuntu is not about someone developing a code you request but rather about Ubuntu specific themes AND expects that you already did some research and provide a specific problem and example of what you already did. – derHugo Oct 09 '17 at 18:28
  • Hi Hugo, I agree with you. This is not the right forum to ask c, cpp. Certainly I am not asking c, cpp program or resolve any error. I asked question to exploit Ubuntu features. I have already done the background work in nautilus. The screen shot shown in question is based on my work. I haven't shown code, bcz, I don't wanted bias others from giving tweaked solutions of mine. And I feel, the problem mentioned will help beginners to increase their productivity. – Ravi Teja Oct 09 '17 at 20:47

2 Answers2

3

1. Create Nautilus script's file and make it executable:

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

2. Here is the content of the script. It creates an auxiliary (auto deleted) script, which is executed in a new gnome-terminal, thus you can see the error messages within the terminal window:

#!/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
  • Additional explanations: Using of an auxiliary script is the most robust way to run more than one commands within a new gnome-terminal, that I found while I made one of my answers.

    Depending of the input parameters of the function compile_and_exec_program, the content of the generated, by the printf section, auxiliary script will be similar as:

    #!/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
    

    Where && means (as usual) if the command that is on the left side is successfully executed, then execute the command that is on the right side. The line rm -f /work/dir/project.bash will remove the auxiliary script itself. The last line exec bash intends to keep open the new gnome-terminal window.

    This part $(echo \'"${AUX}"\') intends to print single quote marks around the name of the aux script. It is important when the script name contains some special characters. I couldn't found other way to do that. Another way to qote only the spaces is using of: ${AUX/\ /\\ }.

  • Here is an example script, that creates a log files, where you can see the error messages from the process.

3. Here is a demonstration (from the previous version) of the script's features:

enter image description here

pa4080
  • 29,831
  • Nice - but you probably want to compile cpp with g++ rather than gcc so that the correct standard libs are linked - you could consider using `make "${FILE_NAME}" which should call the appropriate compiler / linker agnostically – steeldriver Oct 08 '17 at 17:09
  • Hello Pa, Woowww..Thanks..

    However, there is an issue. If there is any errors in program, Terminal is not opening. Due to this we can not see whats the reason for not execution of program. I request you to update this also....

    – Ravi Teja Oct 09 '17 at 03:31
  • Hi Pa, Thanks for the response. Certainly I am not expecting the 1 Code output. Rather my expectation is 2 Code output. However there is small glitch in 2 code.

    Step1: write "Hello World" program without any error. Step 2: Execute it. Step 3: You will see Cpp1.out in the folder. Step 4: Update the Cpp1.cpp code by removing ; to create error. Step 5: Run Cpp1.cpp. Step 6: You can see the error list with description in terminal. Here is the issue, 2 code also running Cpp1.out which was generated in step 3. This is not expected.

    Could you please update the code.

    Thanks!

    – Ravi Teja Oct 09 '17 at 13:28
  • Hi Pa, Issue 2: If the file name has any space, (example: "rev array.cpp" in terminal showing error as "not found". Please update for this also. Thanks! – Ravi Teja Oct 09 '17 at 13:43
  • Issue 3: If the file is other than desktop folder, "not found" error is showing in terminal. Please update this.. – Ravi Teja Oct 09 '17 at 13:58
  • @Pa, suppose, f1 is the folder on desktop, f2 is the sub folder of f1. If you write program Cpp1.cpp in f2, showing "not found" error. Please help. – Ravi Teja Oct 09 '17 at 15:48
  • @Pa, Somehow, I am getting bizarre reactions. I will rephrase the question after finding a pattern to reproduce it.

    I request you to update the code mentioned in Issue 2. I tried the script by changing 16 line code to what you have said. But it is not working. Thanks!

    – Ravi Teja Oct 09 '17 at 16:16
  • @Pa, Great Working as expected even if I put spaces in file names. Thanks. One more small issue I observed is below,

    Step1: write "Hello World" program without any error. Step 2: Execute it. Step 3: You will see Cpp1.out in the folder. Step 4: Update the Cpp1.cpp code by removing ; to create error. Step 5: Run Cpp1.cpp. Step 6: You can see the error list with description in terminal. Here is the issue, 2 code also running Cpp1.out which was generated in step 3. This is not expected. Could you please update the code. Thanks!

    – Ravi Teja Oct 09 '17 at 16:30
  • @RaviTeja, I've managed to solve this in more elegant way rather than the mentioned two solutions. (There are two easy solutions. 1. Delete the previously compiled file. 2. Add random characters to the end of each compiled file, thus the names will not be duplicated.) Done. – pa4080 Oct 09 '17 at 17:48
  • @Pa, Fantastic solution. Your script working for all the scenarios, as I expected. This option is a good time saver for me. Great work. Thanks for your help.. – Ravi Teja Oct 09 '17 at 21:05
1

You have a basic misunderstanding about C/C++ programming: These are not scripts, interpreted at run time. Instead these programs need to be compiled and converted into run-able programs.

Assuming the name of your file is Cpp1.cpp, then you will need to execute the following a terminal:

gcc -o Cpp1 Cpp1.cpp

The resulting output, Cpp1 will be an executable binary file which can be run using the command ./Cpp1 Please note that in this case, this program cannot be run by right clicking on it: it does not have any knowledge about opening windows and using them.

Charles Green
  • 21,339
  • Hi Green, Please see the method I am thinking of, https://i.stack.imgur.com/hB4L1.png Please re look. Thanks – Ravi Teja Oct 08 '17 at 14:13
  • If you are clever with scripting (I am not) you could cause a script to take the filename as an argument, compile the program and then execute it. – Charles Green Oct 08 '17 at 21:10