Creating command line apps using various programming languages is easy with Fedora. For this example we will write a simple c program that gathers system info and prints to stdout.
For simple C programs a compiler and a text editor is all we need to get started.
For this example we will use gcc
as our compiler.
$ sudo dnf install gcc
$ mkdir work && cd work
For this example we will use the uname function in utsname C library to gather information about the system similar to the output of the uname -a
command and format it into a human readable block.
The output from our example cli should match the output of uname
with the corresponding switches.
Here is an example of the uname
output we are trying to achieve using cat
to match the format
$ cat << EOF
Node Info
----------
node: $(uname -n)
system: $(uname -s)
version: $(uname -v)
release: $(uname -r)
arch: $(uname -m)
EOF
The results look like this
Node Info
----------
node: fedora
system: Linux
version: #1 SMP Tue Sep 4 15:56:14 UTC 2018
release: 4.18.5-200.fc28.x86_64
arch: x86_64
Our example is a simple one file C program. To get started we need to write our C code into a file named nodeinfo.c
You can write the C file using the editor of your choice.
$ gedit nodeinfo.c
Here is the example code for nodeinfo.c
// Node Info Cli App
#include <sys/utsname.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main()
{
// define utsname struct
struct utsname info;
// call uname() and check call
if (uname(&info) < 0)
{
// error if call fails
perror("uname");
fprintf(stderr, "Error in uname : %d\n", errno);
exit(EXIT_FAILURE);
} else {
// Print Node Info
printf("Node Info\n----------\n");
printf("node : %s\n", info.nodename);
printf("system : %s\n", info.sysname);
printf("version : %s\n", info.version);
printf("release : %s\n", info.release);
printf("arch : %s\n", info.machine);
exit(EXIT_SUCCESS);
}
}
Save the file as nodeinfo.c
.
We can compile our cli at the command line using gcc
. To do this open a terminal and navigate to your workspace.
The command is as follows.
$ gcc -o nodeinfo nodeinfo.c
The gcc
command flag -o nodeinfo
tells gcc
to generate a binary named nodeinfo
in the same directory as nodeinfo.c
.
The binary should be executable so give it a spin.
$ ./nodeinfo
And the output should be similar to this
Node Info
----------
node : fedora
system : Linux
version : #1 SMP Tue Sep 4 15:56:14 UTC 2018
release : 4.18.5-200.fc28.x86_64
arch : x86_64
Source code for this and more examples
https://github.com/xbcsmith/cli-app
Authors: Adam Samalik, Brett Smith, Máirín Duffy