Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Shell Implementation

Introduction

This project was an assignment of the course "System Programming" in National and Kapodistrian University of Athens.
In this project, we are tasked with creating a simple shell that uses various components to handle different aspects of shell functionality, providing a robust and flexible command-line interface for users. This shell supports:

  • Command execution
  • History management
  • Alias management
  • Wildcard expansion
  • Input/Output Redirections
  • Pipelines
  • Background execution
  • Ctrl-C and Ctrl-Z signal management

Table of Contents

Components

  • Main Program (main.c): Initializes the shell, sets up signal handling, and enters a loop to read and execute commands.
  • History Management (history.c): Manages the history of executed commands.
  • Signal Handling (signals.c): Handles signals like SIGINT and SIGTSTP.
  • Utility Functions (utils.c): Provides utility functions like string duplication, memory allocation checks, and command parsing.
  • Alias Management (aliases.c): Manages command aliases.
  • Command Execution (execute.c): Executes commands, including custom commands and pipelines.
  • Simple Commands (simple_commands.c): Implements simple built-in commands like cd and ver.
  • Wildcard Expansion (wildcards.c): Expands wildcards in command arguments.
  • Redirection (redirect.c): Handles input and output redirection.

Compilation and Execution

To compile the program, a Makefile is provided which automates the build process. The Makefile includes various targets to compile the source files, create necessary directories, and build the executable. To compile the program, simply run the following command in the terminal:

make

This will generate the executable file in the ./bin directory and the object files in the ./build directory. To run the shell, use the following command:

make run

Additionally, you can use make valgrind to run the program with Valgrind for memory leak detection. To clean up the compiled files and the executable, use:

make clean

For more information on available targets, you can use:

make help

Actions and How It Works

Initialization

  • The main function initializes signal handling and creates data structures for history and aliases.
  • It then enters an infinite loop to read and execute commands.

Reading Commands

  • The read_args function reads a command from the user or an alias and splits it into arguments.
  • It checks for wildcards and expands them if necessary.

Handling Aliases

  • The program checks if the first argument is an alias and replaces it with the corresponding command if found.

Executing Commands

  • The execute_custom function checks if the command is a built-in command (e.g., cd, ver, createalias, destroyalias, aliases, history) and executes it if so.
  • If the command is not a built-in command, the program proceeds to execute it as a regular command or a pipeline of commands.

Pipelines and Redirection

  • The execute_pipeline function handles commands with pipes (|), setting up the necessary file descriptors and calling the helper function to execute each stage of the pipeline.
  • The redirection function handles input and output redirection (<, >, >>).

Signal Handling

  • The catchinterrupt function handles signals like SIGINT and SIGTSTP, forwarding them to the currently running process.

History Management

  • The add_history function adds executed commands to the history.
  • The print_history function prints the command history.
  • The manage_history function allows executing commands from the history.

Alias Management

  • The create_alias function creates a new alias.
  • The destroy_alias function removes an alias.
  • The print_aliases function prints all aliases.

Example Workflow

User Input

The user types a command, e.g., ls -l | grep myfile > output.txt.

Command Parsing

The command is read and split into arguments: ["ls", "-l", "|", "grep", "myfile", ">", "output.txt"].

Alias Replacement

The program checks if ls is an alias and replaces it if necessary.

Pipeline and Redirection Handling

  • The program detects the pipe (|) and sets up the necessary file descriptors.
  • It also detects the output redirection (>) and sets up the file descriptor for writing to output.txt.

Command Execution

  • The ls -l command is executed, and its output is piped to the grep myfile command.
  • The output of grep myfile is redirected to output.txt.

History Update

The command is added to the history.

Signal Handling

If the user presses Ctrl+C or Ctrl+Z, the signal is caught and forwarded to the currently running process.

About

πŸ’» This project is a custom shell implementation written in C. It provides a command-line interface for users to execute commands, manage command history, create and use aliases, and handle input/output redirection and pipelines. The shell supports various built-in commands and can execute external programs, making it a versatile tool.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Shell Implementation

Introduction

This project was an assignment of the course "System Programming" in National and Kapodistrian University of Athens.
In this project, we are tasked with creating a simple shell that uses various components to handle different aspects of shell functionality, providing a robust and flexible command-line interface for users. This shell supports:

  • Command execution
  • History management
  • Alias management
  • Wildcard expansion
  • Input/Output Redirections
  • Pipelines
  • Background execution
  • Ctrl-C and Ctrl-Z signal management

Table of Contents

Components

  • Main Program (main.c): Initializes the shell, sets up signal handling, and enters a loop to read and execute commands.
  • History Management (history.c): Manages the history of executed commands.
  • Signal Handling (signals.c): Handles signals like SIGINT and SIGTSTP.
  • Utility Functions (utils.c): Provides utility functions like string duplication, memory allocation checks, and command parsing.
  • Alias Management (aliases.c): Manages command aliases.
  • Command Execution (execute.c): Executes commands, including custom commands and pipelines.
  • Simple Commands (simple_commands.c): Implements simple built-in commands like cd and ver.
  • Wildcard Expansion (wildcards.c): Expands wildcards in command arguments.
  • Redirection (redirect.c): Handles input and output redirection.

Compilation and Execution

To compile the program, a Makefile is provided which automates the build process. The Makefile includes various targets to compile the source files, create necessary directories, and build the executable. To compile the program, simply run the following command in the terminal:

make

This will generate the executable file in the ./bin directory and the object files in the ./build directory. To run the shell, use the following command:

make run

Additionally, you can use make valgrind to run the program with Valgrind for memory leak detection. To clean up the compiled files and the executable, use:

make clean

For more information on available targets, you can use:

make help

Actions and How It Works

Initialization

  • The main function initializes signal handling and creates data structures for history and aliases.
  • It then enters an infinite loop to read and execute commands.

Reading Commands

  • The read_args function reads a command from the user or an alias and splits it into arguments.
  • It checks for wildcards and expands them if necessary.

Handling Aliases

  • The program checks if the first argument is an alias and replaces it with the corresponding command if found.

Executing Commands

  • The execute_custom function checks if the command is a built-in command (e.g., cd, ver, createalias, destroyalias, aliases, history) and executes it if so.
  • If the command is not a built-in command, the program proceeds to execute it as a regular command or a pipeline of commands.

Pipelines and Redirection

  • The execute_pipeline function handles commands with pipes (|), setting up the necessary file descriptors and calling the helper function to execute each stage of the pipeline.
  • The redirection function handles input and output redirection (<, >, >>).

Signal Handling

  • The catchinterrupt function handles signals like SIGINT and SIGTSTP, forwarding them to the currently running process.

History Management

  • The add_history function adds executed commands to the history.
  • The print_history function prints the command history.
  • The manage_history function allows executing commands from the history.

Alias Management

  • The create_alias function creates a new alias.
  • The destroy_alias function removes an alias.
  • The print_aliases function prints all aliases.

Example Workflow

User Input

The user types a command, e.g., ls -l | grep myfile > output.txt.

Command Parsing

The command is read and split into arguments: ["ls", "-l", "|", "grep", "myfile", ">", "output.txt"].

Alias Replacement

The program checks if ls is an alias and replaces it if necessary.

Pipeline and Redirection Handling

  • The program detects the pipe (|) and sets up the necessary file descriptors.
  • It also detects the output redirection (>) and sets up the file descriptor for writing to output.txt.

Command Execution

  • The ls -l command is executed, and its output is piped to the grep myfile command.
  • The output of grep myfile is redirected to output.txt.

History Update

The command is added to the history.

Signal Handling

If the user presses Ctrl+C or Ctrl+Z, the signal is caught and forwarded to the currently running process.

About

πŸ’» This project is a custom shell implementation written in C. It provides a command-line interface for users to execute commands, manage command history, create and use aliases, and handle input/output redirection and pipelines. The shell supports various built-in commands and can execute external programs, making it a versatile tool.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Shell Implementation

Introduction

This project was an assignment of the course "System Programming" in National and Kapodistrian University of Athens.
In this project, we are tasked with creating a simple shell that uses various components to handle different aspects of shell functionality, providing a robust and flexible command-line interface for users. This shell supports:

  • Command execution
  • History management
  • Alias management
  • Wildcard expansion
  • Input/Output Redirections
  • Pipelines
  • Background execution
  • Ctrl-C and Ctrl-Z signal management

Table of Contents

Components

  • Main Program (main.c): Initializes the shell, sets up signal handling, and enters a loop to read and execute commands.
  • History Management (history.c): Manages the history of executed commands.
  • Signal Handling (signals.c): Handles signals like SIGINT and SIGTSTP.
  • Utility Functions (utils.c): Provides utility functions like string duplication, memory allocation checks, and command parsing.
  • Alias Management (aliases.c): Manages command aliases.
  • Command Execution (execute.c): Executes commands, including custom commands and pipelines.
  • Simple Commands (simple_commands.c): Implements simple built-in commands like cd and ver.
  • Wildcard Expansion (wildcards.c): Expands wildcards in command arguments.
  • Redirection (redirect.c): Handles input and output redirection.

Compilation and Execution

To compile the program, a Makefile is provided which automates the build process. The Makefile includes various targets to compile the source files, create necessary directories, and build the executable. To compile the program, simply run the following command in the terminal:

make

This will generate the executable file in the ./bin directory and the object files in the ./build directory. To run the shell, use the following command:

make run

Additionally, you can use make valgrind to run the program with Valgrind for memory leak detection. To clean up the compiled files and the executable, use:

make clean

For more information on available targets, you can use:

make help

Actions and How It Works

Initialization

  • The main function initializes signal handling and creates data structures for history and aliases.
  • It then enters an infinite loop to read and execute commands.

Reading Commands

  • The read_args function reads a command from the user or an alias and splits it into arguments.
  • It checks for wildcards and expands them if necessary.

Handling Aliases

  • The program checks if the first argument is an alias and replaces it with the corresponding command if found.

Executing Commands

  • The execute_custom function checks if the command is a built-in command (e.g., cd, ver, createalias, destroyalias, aliases, history) and executes it if so.
  • If the command is not a built-in command, the program proceeds to execute it as a regular command or a pipeline of commands.

Pipelines and Redirection

  • The execute_pipeline function handles commands with pipes (|), setting up the necessary file descriptors and calling the helper function to execute each stage of the pipeline.
  • The redirection function handles input and output redirection (<, >, >>).

Signal Handling

  • The catchinterrupt function handles signals like SIGINT and SIGTSTP, forwarding them to the currently running process.

History Management

  • The add_history function adds executed commands to the history.
  • The print_history function prints the command history.
  • The manage_history function allows executing commands from the history.

Alias Management

  • The create_alias function creates a new alias.
  • The destroy_alias function removes an alias.
  • The print_aliases function prints all aliases.

Example Workflow

User Input

The user types a command, e.g., ls -l | grep myfile > output.txt.

Command Parsing

The command is read and split into arguments: ["ls", "-l", "|", "grep", "myfile", ">", "output.txt"].

Alias Replacement

The program checks if ls is an alias and replaces it if necessary.

Pipeline and Redirection Handling

  • The program detects the pipe (|) and sets up the necessary file descriptors.
  • It also detects the output redirection (>) and sets up the file descriptor for writing to output.txt.

Command Execution

  • The ls -l command is executed, and its output is piped to the grep myfile command.
  • The output of grep myfile is redirected to output.txt.

History Update

The command is added to the history.

Signal Handling

If the user presses Ctrl+C or Ctrl+Z, the signal is caught and forwarded to the currently running process.

About

πŸ’» This project is a custom shell implementation written in C. It provides a command-line interface for users to execute commands, manage command history, create and use aliases, and handle input/output redirection and pipelines. The shell supports various built-in commands and can execute external programs, making it a versatile tool.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Shell Implementation

Introduction

This project was an assignment of the course "System Programming" in National and Kapodistrian University of Athens.
In this project, we are tasked with creating a simple shell that uses various components to handle different aspects of shell functionality, providing a robust and flexible command-line interface for users. This shell supports:

  • Command execution
  • History management
  • Alias management
  • Wildcard expansion
  • Input/Output Redirections
  • Pipelines
  • Background execution
  • Ctrl-C and Ctrl-Z signal management

Table of Contents

Components

  • Main Program (main.c): Initializes the shell, sets up signal handling, and enters a loop to read and execute commands.
  • History Management (history.c): Manages the history of executed commands.
  • Signal Handling (signals.c): Handles signals like SIGINT and SIGTSTP.
  • Utility Functions (utils.c): Provides utility functions like string duplication, memory allocation checks, and command parsing.
  • Alias Management (aliases.c): Manages command aliases.
  • Command Execution (execute.c): Executes commands, including custom commands and pipelines.
  • Simple Commands (simple_commands.c): Implements simple built-in commands like cd and ver.
  • Wildcard Expansion (wildcards.c): Expands wildcards in command arguments.
  • Redirection (redirect.c): Handles input and output redirection.

Compilation and Execution

To compile the program, a Makefile is provided which automates the build process. The Makefile includes various targets to compile the source files, create necessary directories, and build the executable. To compile the program, simply run the following command in the terminal:

make

This will generate the executable file in the ./bin directory and the object files in the ./build directory. To run the shell, use the following command:

make run

Additionally, you can use make valgrind to run the program with Valgrind for memory leak detection. To clean up the compiled files and the executable, use:

make clean

For more information on available targets, you can use:

make help

Actions and How It Works

Initialization

  • The main function initializes signal handling and creates data structures for history and aliases.
  • It then enters an infinite loop to read and execute commands.

Reading Commands

  • The read_args function reads a command from the user or an alias and splits it into arguments.
  • It checks for wildcards and expands them if necessary.

Handling Aliases

  • The program checks if the first argument is an alias and replaces it with the corresponding command if found.

Executing Commands

  • The execute_custom function checks if the command is a built-in command (e.g., cd, ver, createalias, destroyalias, aliases, history) and executes it if so.
  • If the command is not a built-in command, the program proceeds to execute it as a regular command or a pipeline of commands.

Pipelines and Redirection

  • The execute_pipeline function handles commands with pipes (|), setting up the necessary file descriptors and calling the helper function to execute each stage of the pipeline.
  • The redirection function handles input and output redirection (<, >, >>).

Signal Handling

  • The catchinterrupt function handles signals like SIGINT and SIGTSTP, forwarding them to the currently running process.

History Management

  • The add_history function adds executed commands to the history.
  • The print_history function prints the command history.
  • The manage_history function allows executing commands from the history.

Alias Management

  • The create_alias function creates a new alias.
  • The destroy_alias function removes an alias.
  • The print_aliases function prints all aliases.

Example Workflow

User Input

The user types a command, e.g., ls -l | grep myfile > output.txt.

Command Parsing

The command is read and split into arguments: ["ls", "-l", "|", "grep", "myfile", ">", "output.txt"].

Alias Replacement

The program checks if ls is an alias and replaces it if necessary.

Pipeline and Redirection Handling

  • The program detects the pipe (|) and sets up the necessary file descriptors.
  • It also detects the output redirection (>) and sets up the file descriptor for writing to output.txt.

Command Execution

  • The ls -l command is executed, and its output is piped to the grep myfile command.
  • The output of grep myfile is redirected to output.txt.

History Update

The command is added to the history.

Signal Handling

If the user presses Ctrl+C or Ctrl+Z, the signal is caught and forwarded to the currently running process.

About

πŸ’» This project is a custom shell implementation written in C. It provides a command-line interface for users to execute commands, manage command history, create and use aliases, and handle input/output redirection and pipelines. The shell supports various built-in commands and can execute external programs, making it a versatile tool.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Shell Implementation

Introduction

This project was an assignment of the course "System Programming" in National and Kapodistrian University of Athens.
In this project, we are tasked with creating a simple shell that uses various components to handle different aspects of shell functionality, providing a robust and flexible command-line interface for users. This shell supports:

  • Command execution
  • History management
  • Alias management
  • Wildcard expansion
  • Input/Output Redirections
  • Pipelines
  • Background execution
  • Ctrl-C and Ctrl-Z signal management

Table of Contents

Components

  • Main Program (main.c): Initializes the shell, sets up signal handling, and enters a loop to read and execute commands.
  • History Management (history.c): Manages the history of executed commands.
  • Signal Handling (signals.c): Handles signals like SIGINT and SIGTSTP.
  • Utility Functions (utils.c): Provides utility functions like string duplication, memory allocation checks, and command parsing.
  • Alias Management (aliases.c): Manages command aliases.
  • Command Execution (execute.c): Executes commands, including custom commands and pipelines.
  • Simple Commands (simple_commands.c): Implements simple built-in commands like cd and ver.
  • Wildcard Expansion (wildcards.c): Expands wildcards in command arguments.
  • Redirection (redirect.c): Handles input and output redirection.

Compilation and Execution

To compile the program, a Makefile is provided which automates the build process. The Makefile includes various targets to compile the source files, create necessary directories, and build the executable. To compile the program, simply run the following command in the terminal:

make

This will generate the executable file in the ./bin directory and the object files in the ./build directory. To run the shell, use the following command:

make run

Additionally, you can use make valgrind to run the program with Valgrind for memory leak detection. To clean up the compiled files and the executable, use:

make clean

For more information on available targets, you can use:

make help

Actions and How It Works

Initialization

  • The main function initializes signal handling and creates data structures for history and aliases.
  • It then enters an infinite loop to read and execute commands.

Reading Commands

  • The read_args function reads a command from the user or an alias and splits it into arguments.
  • It checks for wildcards and expands them if necessary.

Handling Aliases

  • The program checks if the first argument is an alias and replaces it with the corresponding command if found.

Executing Commands

  • The execute_custom function checks if the command is a built-in command (e.g., cd, ver, createalias, destroyalias, aliases, history) and executes it if so.
  • If the command is not a built-in command, the program proceeds to execute it as a regular command or a pipeline of commands.

Pipelines and Redirection

  • The execute_pipeline function handles commands with pipes (|), setting up the necessary file descriptors and calling the helper function to execute each stage of the pipeline.
  • The redirection function handles input and output redirection (<, >, >>).

Signal Handling

  • The catchinterrupt function handles signals like SIGINT and SIGTSTP, forwarding them to the currently running process.

History Management

  • The add_history function adds executed commands to the history.
  • The print_history function prints the command history.
  • The manage_history function allows executing commands from the history.

Alias Management

  • The create_alias function creates a new alias.
  • The destroy_alias function removes an alias.
  • The print_aliases function prints all aliases.

Example Workflow

User Input

The user types a command, e.g., ls -l | grep myfile > output.txt.

Command Parsing

The command is read and split into arguments: ["ls", "-l", "|", "grep", "myfile", ">", "output.txt"].

Alias Replacement

The program checks if ls is an alias and replaces it if necessary.

Pipeline and Redirection Handling

  • The program detects the pipe (|) and sets up the necessary file descriptors.
  • It also detects the output redirection (>) and sets up the file descriptor for writing to output.txt.

Command Execution

  • The ls -l command is executed, and its output is piped to the grep myfile command.
  • The output of grep myfile is redirected to output.txt.

History Update

The command is added to the history.

Signal Handling

If the user presses Ctrl+C or Ctrl+Z, the signal is caught and forwarded to the currently running process.

About

πŸ’» This project is a custom shell implementation written in C. It provides a command-line interface for users to execute commands, manage command history, create and use aliases, and handle input/output redirection and pipelines. The shell supports various built-in commands and can execute external programs, making it a versatile tool.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Shell Implementation

Introduction

This project was an assignment of the course "System Programming" in National and Kapodistrian University of Athens.
In this project, we are tasked with creating a simple shell that uses various components to handle different aspects of shell functionality, providing a robust and flexible command-line interface for users. This shell supports:

  • Command execution
  • History management
  • Alias management
  • Wildcard expansion
  • Input/Output Redirections
  • Pipelines
  • Background execution
  • Ctrl-C and Ctrl-Z signal management

Table of Contents

Components

  • Main Program (main.c): Initializes the shell, sets up signal handling, and enters a loop to read and execute commands.
  • History Management (history.c): Manages the history of executed commands.
  • Signal Handling (signals.c): Handles signals like SIGINT and SIGTSTP.
  • Utility Functions (utils.c): Provides utility functions like string duplication, memory allocation checks, and command parsing.
  • Alias Management (aliases.c): Manages command aliases.
  • Command Execution (execute.c): Executes commands, including custom commands and pipelines.
  • Simple Commands (simple_commands.c): Implements simple built-in commands like cd and ver.
  • Wildcard Expansion (wildcards.c): Expands wildcards in command arguments.
  • Redirection (redirect.c): Handles input and output redirection.

Compilation and Execution

To compile the program, a Makefile is provided which automates the build process. The Makefile includes various targets to compile the source files, create necessary directories, and build the executable. To compile the program, simply run the following command in the terminal:

make

This will generate the executable file in the ./bin directory and the object files in the ./build directory. To run the shell, use the following command:

make run

Additionally, you can use make valgrind to run the program with Valgrind for memory leak detection. To clean up the compiled files and the executable, use:

make clean

For more information on available targets, you can use:

make help

Actions and How It Works

Initialization

  • The main function initializes signal handling and creates data structures for history and aliases.
  • It then enters an infinite loop to read and execute commands.

Reading Commands

  • The read_args function reads a command from the user or an alias and splits it into arguments.
  • It checks for wildcards and expands them if necessary.

Handling Aliases

  • The program checks if the first argument is an alias and replaces it with the corresponding command if found.

Executing Commands

  • The execute_custom function checks if the command is a built-in command (e.g., cd, ver, createalias, destroyalias, aliases, history) and executes it if so.
  • If the command is not a built-in command, the program proceeds to execute it as a regular command or a pipeline of commands.

Pipelines and Redirection

  • The execute_pipeline function handles commands with pipes (|), setting up the necessary file descriptors and calling the helper function to execute each stage of the pipeline.
  • The redirection function handles input and output redirection (<, >, >>).

Signal Handling

  • The catchinterrupt function handles signals like SIGINT and SIGTSTP, forwarding them to the currently running process.

History Management

  • The add_history function adds executed commands to the history.
  • The print_history function prints the command history.
  • The manage_history function allows executing commands from the history.

Alias Management

  • The create_alias function creates a new alias.
  • The destroy_alias function removes an alias.
  • The print_aliases function prints all aliases.

Example Workflow

User Input

The user types a command, e.g., ls -l | grep myfile > output.txt.

Command Parsing

The command is read and split into arguments: ["ls", "-l", "|", "grep", "myfile", ">", "output.txt"].

Alias Replacement

The program checks if ls is an alias and replaces it if necessary.

Pipeline and Redirection Handling

  • The program detects the pipe (|) and sets up the necessary file descriptors.
  • It also detects the output redirection (>) and sets up the file descriptor for writing to output.txt.

Command Execution

  • The ls -l command is executed, and its output is piped to the grep myfile command.
  • The output of grep myfile is redirected to output.txt.

History Update

The command is added to the history.

Signal Handling

If the user presses Ctrl+C or Ctrl+Z, the signal is caught and forwarded to the currently running process.

About

πŸ’» This project is a custom shell implementation written in C. It provides a command-line interface for users to execute commands, manage command history, create and use aliases, and handle input/output redirection and pipelines. The shell supports various built-in commands and can execute external programs, making it a versatile tool.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Shell Implementation

Introduction

This project was an assignment of the course "System Programming" in National and Kapodistrian University of Athens.
In this project, we are tasked with creating a simple shell that uses various components to handle different aspects of shell functionality, providing a robust and flexible command-line interface for users. This shell supports:

  • Command execution
  • History management
  • Alias management
  • Wildcard expansion
  • Input/Output Redirections
  • Pipelines
  • Background execution
  • Ctrl-C and Ctrl-Z signal management

Table of Contents

Components

  • Main Program (main.c): Initializes the shell, sets up signal handling, and enters a loop to read and execute commands.
  • History Management (history.c): Manages the history of executed commands.
  • Signal Handling (signals.c): Handles signals like SIGINT and SIGTSTP.
  • Utility Functions (utils.c): Provides utility functions like string duplication, memory allocation checks, and command parsing.
  • Alias Management (aliases.c): Manages command aliases.
  • Command Execution (execute.c): Executes commands, including custom commands and pipelines.
  • Simple Commands (simple_commands.c): Implements simple built-in commands like cd and ver.
  • Wildcard Expansion (wildcards.c): Expands wildcards in command arguments.
  • Redirection (redirect.c): Handles input and output redirection.

Compilation and Execution

To compile the program, a Makefile is provided which automates the build process. The Makefile includes various targets to compile the source files, create necessary directories, and build the executable. To compile the program, simply run the following command in the terminal:

make

This will generate the executable file in the ./bin directory and the object files in the ./build directory. To run the shell, use the following command:

make run

Additionally, you can use make valgrind to run the program with Valgrind for memory leak detection. To clean up the compiled files and the executable, use:

make clean

For more information on available targets, you can use:

make help

Actions and How It Works

Initialization

  • The main function initializes signal handling and creates data structures for history and aliases.
  • It then enters an infinite loop to read and execute commands.

Reading Commands

  • The read_args function reads a command from the user or an alias and splits it into arguments.
  • It checks for wildcards and expands them if necessary.

Handling Aliases

  • The program checks if the first argument is an alias and replaces it with the corresponding command if found.

Executing Commands

  • The execute_custom function checks if the command is a built-in command (e.g., cd, ver, createalias, destroyalias, aliases, history) and executes it if so.
  • If the command is not a built-in command, the program proceeds to execute it as a regular command or a pipeline of commands.

Pipelines and Redirection

  • The execute_pipeline function handles commands with pipes (|), setting up the necessary file descriptors and calling the helper function to execute each stage of the pipeline.
  • The redirection function handles input and output redirection (<, >, >>).

Signal Handling

  • The catchinterrupt function handles signals like SIGINT and SIGTSTP, forwarding them to the currently running process.

History Management

  • The add_history function adds executed commands to the history.
  • The print_history function prints the command history.
  • The manage_history function allows executing commands from the history.

Alias Management

  • The create_alias function creates a new alias.
  • The destroy_alias function removes an alias.
  • The print_aliases function prints all aliases.

Example Workflow

User Input

The user types a command, e.g., ls -l | grep myfile > output.txt.

Command Parsing

The command is read and split into arguments: ["ls", "-l", "|", "grep", "myfile", ">", "output.txt"].

Alias Replacement

The program checks if ls is an alias and replaces it if necessary.

Pipeline and Redirection Handling

  • The program detects the pipe (|) and sets up the necessary file descriptors.
  • It also detects the output redirection (>) and sets up the file descriptor for writing to output.txt.

Command Execution

  • The ls -l command is executed, and its output is piped to the grep myfile command.
  • The output of grep myfile is redirected to output.txt.

History Update

The command is added to the history.

Signal Handling

If the user presses Ctrl+C or Ctrl+Z, the signal is caught and forwarded to the currently running process.

About

πŸ’» This project is a custom shell implementation written in C. It provides a command-line interface for users to execute commands, manage command history, create and use aliases, and handle input/output redirection and pipelines. The shell supports various built-in commands and can execute external programs, making it a versatile tool.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Shell Implementation

Introduction

This project was an assignment of the course "System Programming" in National and Kapodistrian University of Athens.
In this project, we are tasked with creating a simple shell that uses various components to handle different aspects of shell functionality, providing a robust and flexible command-line interface for users. This shell supports:

  • Command execution
  • History management
  • Alias management
  • Wildcard expansion
  • Input/Output Redirections
  • Pipelines
  • Background execution
  • Ctrl-C and Ctrl-Z signal management

Table of Contents

Components

  • Main Program (main.c): Initializes the shell, sets up signal handling, and enters a loop to read and execute commands.
  • History Management (history.c): Manages the history of executed commands.
  • Signal Handling (signals.c): Handles signals like SIGINT and SIGTSTP.
  • Utility Functions (utils.c): Provides utility functions like string duplication, memory allocation checks, and command parsing.
  • Alias Management (aliases.c): Manages command aliases.
  • Command Execution (execute.c): Executes commands, including custom commands and pipelines.
  • Simple Commands (simple_commands.c): Implements simple built-in commands like cd and ver.
  • Wildcard Expansion (wildcards.c): Expands wildcards in command arguments.
  • Redirection (redirect.c): Handles input and output redirection.

Compilation and Execution

To compile the program, a Makefile is provided which automates the build process. The Makefile includes various targets to compile the source files, create necessary directories, and build the executable. To compile the program, simply run the following command in the terminal:

make

This will generate the executable file in the ./bin directory and the object files in the ./build directory. To run the shell, use the following command:

make run

Additionally, you can use make valgrind to run the program with Valgrind for memory leak detection. To clean up the compiled files and the executable, use:

make clean

For more information on available targets, you can use:

make help

Actions and How It Works

Initialization

  • The main function initializes signal handling and creates data structures for history and aliases.
  • It then enters an infinite loop to read and execute commands.

Reading Commands

  • The read_args function reads a command from the user or an alias and splits it into arguments.
  • It checks for wildcards and expands them if necessary.

Handling Aliases

  • The program checks if the first argument is an alias and replaces it with the corresponding command if found.

Executing Commands

  • The execute_custom function checks if the command is a built-in command (e.g., cd, ver, createalias, destroyalias, aliases, history) and executes it if so.
  • If the command is not a built-in command, the program proceeds to execute it as a regular command or a pipeline of commands.

Pipelines and Redirection

  • The execute_pipeline function handles commands with pipes (|), setting up the necessary file descriptors and calling the helper function to execute each stage of the pipeline.
  • The redirection function handles input and output redirection (<, >, >>).

Signal Handling

  • The catchinterrupt function handles signals like SIGINT and SIGTSTP, forwarding them to the currently running process.

History Management

  • The add_history function adds executed commands to the history.
  • The print_history function prints the command history.
  • The manage_history function allows executing commands from the history.

Alias Management

  • The create_alias function creates a new alias.
  • The destroy_alias function removes an alias.
  • The print_aliases function prints all aliases.

Example Workflow

User Input

The user types a command, e.g., ls -l | grep myfile > output.txt.

Command Parsing

The command is read and split into arguments: ["ls", "-l", "|", "grep", "myfile", ">", "output.txt"].

Alias Replacement

The program checks if ls is an alias and replaces it if necessary.

Pipeline and Redirection Handling

  • The program detects the pipe (|) and sets up the necessary file descriptors.
  • It also detects the output redirection (>) and sets up the file descriptor for writing to output.txt.

Command Execution

  • The ls -l command is executed, and its output is piped to the grep myfile command.
  • The output of grep myfile is redirected to output.txt.

History Update

The command is added to the history.

Signal Handling

If the user presses Ctrl+C or Ctrl+Z, the signal is caught and forwarded to the currently running process.

About

πŸ’» This project is a custom shell implementation written in C. It provides a command-line interface for users to execute commands, manage command history, create and use aliases, and handle input/output redirection and pipelines. The shell supports various built-in commands and can execute external programs, making it a versatile tool.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages