C++ Shell Tutorial – Complete Guide

Welcome to Zenva’s comprehensive guide to shell programming in C++. Whether you’re taking your first steps into coding or you’re an experienced programmer looking to expand your skillset, this tutorial serves as a handy reference to understand and master the basics of shell programming using C++.

What is C++ Shell?

C++ shell is a language feature that allows you to execute operating system commands directly from a C++ program. This concept is similar to shell scripting in some other programming languages, providing a very flexible and powerful approach to control system processes, manipulate files, and automate tasks.

Why Should You Learn C++ Shell Programming?

Understanding how to use the shell capabilities of C++ can provide valuable utility to a coder in various scenarios. Whether it’s for automating output generation, setting up scripts for testing, or simply streamlining development workflows, a strong grasp on shell commands can significantly improve your programming effectiveness.

What Purpose Does it Serve?

Since shell commands can interact directly with the operating system, they bring a new dimension to what your program can do. This makes shell programming essential for system-level programming, whether it is creating batch jobs, scheduling tasks, or even creating simple games.

So buckle up and get ready to dive into the fascinating world of C++ shell programming!

CTA Small Image
FREE COURSES AT ZENVA
LEARN GAME DEVELOPMENT, PYTHON AND MORE
ACCESS FOR FREE
AVAILABLE FOR A LIMITED TIME ONLY

Basic System Commands in C++

The system function is the main tool for C++ to execute shell commands. It takes a single string parameter, which is the command you want to execute.

Here are a few examples:

#include 

int main() {
    system("ls");  // List files in current directory
    return 0;
}

In the above example, we use the ls Unix command to list all the files and directories in the current location.

Similarly, you can use nearly any command that works in your terminal or command prompt.

#include 

int main() {
    system("mkdir new_folder"); // Create a new directory
    system("rm -r old_folder"); // Remove an existing directory
    return 0;
}

In this example, the first command creates a new directory named “new_folder”, and the second command removes the directory “old_folder”.

Getting the Output of Commands

The popen() and pclose() functions can be used to execute a shell command and get its output. They return a file pointer which you can then read using standard C++ file reading functions. Check out the example:

#include 
#include 

int main() {
    FILE* pipe = popen("ls", "r");

    if (!pipe) return 1;

    char buffer[128];
    std::string result = "";

    while (!feof(pipe)) {
        if (fgets(buffer, 128, pipe) != NULL)
            result += buffer;
    }

    pclose(pipe);

    std::cout << result;

    return 0;
}

This example executes the ls command and prints the output to the console. We use a while loop to read from the pipe until there is nothing left to read.

Remember that shell commands can be dangerous if used improperly. It’s essential to know what each command does before using it in your program.

Passing Variables to Shell Commands

You can pass variables to shell commands in the same way you would when running commands in the terminal. This can be done using the C++ string format options.

A simple example would be passing a directory name to the ls command:

#include 
#include 

int main() {
    std::string directory = "/home/user/Documents";
    std::string command = "ls " + directory;

    system(command.c_str());
    
    return 0;
}

In this example, we concatenate the directory variable to the command string. When this command is passed to the system() function, it will list all the files in the specified directory.

Creating Scripts within C++ Code

In addition to running a single command, you can also create and execute scripts from within your C++ code.

For example, you can create a bash script, give it permissions, and then run it:

#include 

int main() {
    system("echo '#!/bin/bash\n\n echo Hello, World!' > script.sh");
    system("chmod +x script.sh");
    system("./script.sh");

    return 0;
}

The first command in this example creates a new bash script with the content as “echo Hello, World!“.
The second command makes our script executable.
Finally, the third command executes the script. When run, this program will print “Hello, World!” to the console.

Dealing with User Input

User input can be added to the command string to create a more dynamic execution process:

#include 
#include 
#include 

int main() {
    std::string filename;
    std::cout <> filename;
    std::string command = "rm " + filename;

    system(command.c_str());

    return 0;
}

This example prompts the user to enter a filename and deletes the specified file. Be very cautious when running this, as it can remove files permanently!

By incorporating shell commands into your C++ program, you can leverage a wide range of capabilities offered by your operating system. While it’s empowering to have this level of control, it is crucial to keep in mind the potential pitfalls and adopt good programming practices to avoid issues and ensure the secure execution of your programs.

File Handling with Shell Commands

To further explore the capabilities of shell commands, let’s consider a scenario in file handling. If you want to rename a file, you can use the mv command:

#include 

int main() {
    const char* old_name = "old_filename.txt";
    const char* new_name = "new_filename.txt";
    std::string command = "mv " + std::string(old_name) + " " + std::string(new_name);

    system(command.c_str());

    return 0;
}

In this code snippet, the mv command renames the file from “old_filename.txt” to “new_filename.txt”. Now, let’s take a sample of creating a new file:

#include 

int main() {
    const char* filename = "newfile.txt";
    std::string command = "touch " + std::string(filename);

    system(command.c_str());

    return 0;
}

The touch command creates an empty file with the name “newfile.txt”. If the file already exists, the touch command updates the last accessed and modified timestamps.

Running Multiple Shell Commands

In more complex scenarios, you may need to run multiple shell commands in sequence. You can easily achieve this by using the “;” character to separate the different commands:

#include 

int main() {
    system("cd /home/user/Documents; ls; pwd");

    return 0;
}

The example above changes the current working directory, lists all files in that directory, and then prints the working directory’s path on the console.

Checking the Output of a Command

Multiple shell utilities return output that can be used in the conditional checking process. Take the following snippet, for example, the system() function returns the exit status of the shell command that was executed:

#include 

int main() {
    int status = system("ls nonexistent_folder");

    if (status == 0) {
        std::cout << "Command successfully executed!\n";
    } else {
        std::cout << "Command failed!\n";
    }

    return 0;
}

The system() function will return 0 if the command has been successfully executed and not 0 if the command fails. Considering that the folder “nonexistent_folder” does not exist, “Command failed!” will be printed.

Moving to Paths with Spaces

When working with paths that contain spaces, enclose the path in quotes:

#include 

int main() {
    system("cd \"/home/user/My Documents\"; ls; pwd");

    return 0;
}

In the above snippet, the shell changes the directory to “/home/user/My Documents”, lists all the files, and then prints the path to the console. Note that the path is enclosed in quotes to make sure the shell interprets it as a single argument.

Wrapping Up

As you can see, using C++ shell programming can be a powerful tool to elevate your programs to the next level. It offers a wide range of functionalities and enables you to make the most of your operating system. Understand that a combination of both a solid knowledge base and cautious execution is critical when employing these capabilities in your C++ projects. Happy coding, and continue pushing the boundaries of what you can do with C++!

Where to Go Next?

Now that you have got your feet wet in C++ shell programming, it’s time to delve deeper. And we, at Zenva, are more than ready to accompany you on this learning journey. Our C++ Programming Academy provides comprehensive courses to learn and expand your grasp on C++. Whether building text-based RPGs or roguelike dungeon crawlers, our courses have you covered. The courses not only give extensive practice on the C++ basics, program flow, and object-oriented programming but also approaches the popular game mechanics, and the use of graphics and audio with SFML. All the while, we encourage you to focus on real project-based learning to create a portfolio that stands out.

For those looking to add more variety to their learning path, you can explore our broader collection of C++ Courses. They cater to different levels of expertise and topics of interest.

At Zenva, we offer over 250 engaging, high-quality courses covering everything – from programming, game development, to AI, so whether you are a novice looking to learn coding from scratch or an established developer seeking to refine your skills further, there is always something new to learn with us.

Keep up the forward momentum in your programming journey, and remember, whether it’s coding or creating games, it’s all about enjoying the learning process. Keep on learning, experimenting, and challenging yourself, and see where it takes you!

Conclusion

Mastering shell programming in C++ is undeniably a skill that will set you apart as a developer. We, at Zenva, assure you the robust knowledge you need to make your way in the programming world. Armed with the right tools and the newfound understanding of C++ shell programming, you are on the right track to advance your coding and create programs that drive real-world impact.

We invite you to take the next step and dive deeper into the world of C++. Explore our interactive, in-depth C++ Programming Academy courses and see where your programming journey takes you next. Remember, exploring and learning new skills is what keeps us moving forward. So keep coding, keep learning, and above all, keep enjoying the process!

Did you come across any errors in this tutorial? Please let us know by completing this form and we’ll look into it!

FREE COURSES
Python Blog Image

FINAL DAYS: Unlock coding courses in Unity, Godot, Unreal, Python and more.