{"id":19053294,"url":"https://github.com/jotavare/minishell","last_synced_at":"2025-04-24T02:48:06.650Z","repository":{"id":167196698,"uuid":"636464593","full_name":"jotavare/minishell","owner":"jotavare","description":"A simplified version of a unix shell, implemented as a command-line interpreter.","archived":false,"fork":false,"pushed_at":"2024-06-26T23:16:05.000Z","size":1974,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-06-27T02:54:31.874Z","etag":null,"topics":["bash","builtin","c","gdb","input-validation","lexer","linux","makefile","minishell","norminette","parser","readline","shell","signals","unix","valgrind"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jotavare.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-05-04T22:59:59.000Z","updated_at":"2024-06-26T23:18:02.000Z","dependencies_parsed_at":null,"dependency_job_id":"faeca01b-f225-460b-9b2d-c1bbe8ebe225","html_url":"https://github.com/jotavare/minishell","commit_stats":null,"previous_names":["jotavare/minishell"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jotavare%2Fminishell","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jotavare%2Fminishell/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jotavare%2Fminishell/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jotavare%2Fminishell/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jotavare","download_url":"https://codeload.github.com/jotavare/minishell/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223768227,"owners_count":17199323,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","builtin","c","gdb","input-validation","lexer","linux","makefile","minishell","norminette","parser","readline","shell","signals","unix","valgrind"],"created_at":"2024-11-08T23:30:00.340Z","updated_at":"2024-11-08T23:30:00.896Z","avatar_url":"https://github.com/jotavare.png","language":"C","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/jotavare/jotavare/blob/main/42/banners/piscine_and_common_core/github_piscine_and_common_core_banner_minishell.png\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003cimg src=\"https://img.shields.io/badge/status-finished-success?color=%2312bab9\u0026style=flat-square\"/\u003e\n\t\u003cimg src=\"https://img.shields.io/badge/evaluated-18%20%2F%2012%20%2F%202022-success?color=%2312bab9\u0026style=flat-square\"/\u003e\n\t\u003cimg src=\"https://img.shields.io/badge/score-100%20%2F%20100-success?color=%2312bab9\u0026style=flat-square\"/\u003e\n\t\u003cimg src=\"https://img.shields.io/github/languages/top/jotavare/minishell?color=%2312bab9\u0026style=flat-square\"/\u003e\n\t\u003cimg src=\"https://img.shields.io/github/last-commit/jotavare/minishell?color=%2312bab9\u0026style=flat-square\"/\u003e\n\t\u003ca href='https://www.linkedin.com/in/joaoptoliveira' target=\"_blank\"\u003e\u003cimg alt='Linkedin' src='https://img.shields.io/badge/LinkedIn-100000?style=flat-square\u0026logo=Linkedin\u0026logoColor=white\u0026labelColor=0A66C2\u0026color=0A66C2'/\u003e\u003c/a\u003e\n\t\u003ca href='https://profile.intra.42.fr/users/jotavare' target=\"_blank\"\u003e\u003cimg alt='42' src='https://img.shields.io/badge/Porto-100000?style=flat-square\u0026logo=42\u0026logoColor=white\u0026labelColor=000000\u0026color=000000'/\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n\t\u003ca href=\"#about\"\u003eAbout\u003c/a\u003e •\n\t\u003ca href=\"#important-information\"\u003eImportant Information\u003c/a\u003e •\n\t\u003ca href=\"#utilities\"\u003eUtilities\u003c/a\u003e •\n\t\u003ca href=\"#command-examples\"\u003eCommand Examples\u003c/a\u003e •\n\t\u003ca href=\"#norminette\"\u003eNorminette\u003c/a\u003e •\n\t\u003ca href=\"#contributing\"\u003eContributing\u003c/a\u003e •\n\t\u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\n\u003c/p\u003e\n\n## ABOUT\nThe existence of shells is linked to the very existence of IT. At the time, all developers agreed that communicating with a computer using aligned 1/0 switches was seriously irritating. It was only logical that they came up with the idea of creating software to communicate with a computer using interactive lines of commands in a language somewhat close to the human language.\n\nThanks to Minishell, I travelled through time and came back to problems people faced when Windows didn’t exist. This project was about creating a simple shell, my own little bash. I learned a lot about processes and file descriptors.\n\n- [Subject](https://github.com/jotavare/minishell/blob/main/subject/en_subject_minishell.pdf) `PDF`\n- [References](https://github.com/jotavare/42-resources#03-minishell) `GitHub`\n\n## IMPORTANT INFORMATION\n#### BEFORE EVALUATION\n\u003e Check this list before delivering the project.\n\n- [x] Check the norminette for any errors.\n- [x] Check for segmentation faults, bus errors, double free, leaks, ...\n- [x] Must compile with -Wall, -Wextra and -Werror.\n- [x] Makefile must contain $(NAME), all, clean, fclean.\n- [x] Check for forbidden functions in your code.\n- [x] Check the subject for any other requirements.\n\n#### NICE TO KNOW\n\u003e Some nice-to-know commands that will help the evaluatee and the evaluator.\n\n| Important Commands                | Description                                                              |\n| :-------------------------------- | :----------------------------------------------------------------------- |\n| `make -n`                         | Display the compilation information without actually compiling the code. |\n| `echo $?`                         | Display the exit status of the last executed command.                    |\n| `nm -g ./minishell \\| grep \" U \"` | Check for forbidden functions.                                           |\n| `norminette`                      | Checks the code for compliance with the coding style and guidelines.     |\n| `-R CheckForbiddenSourceHeader`   | Check the code in header files.                                          |\n| `cc -g -Wall -Wextra -Werror`     | Compile with the mandatory flags.                                        |\n| `-fsanitize=address`              | Check for leaks.                                                         |\n| `-lreadline`                      | Necessary to use the readline library.                                   |\n| `ps -e` or `ps -A`                | See all processes currently running on your computer.                    |\n| `ps -a`                           | Check for any dead children.                                             |\n\n#### VALGRIND\n\u003e Important valgrind flags that are necessary to know every single leak.\n\n| Valgrind Flags                 | Description                                      |\n| :----------------------------- | :----------------------------------------------- |\n| `valgrind ./minishell`         | Check for leaks                                  |\n| `-leak-check=full`             | Detailed checking for memory leaks.              |\n| `--show-leak-kinds=all`        | Display all types of memory leaks.               |\n| `--track-origins=yes`          | Tracks the origins of uninitialized values.      |\n| `--verbose`                    | Increases the level of verbosity.                |\n| `--gen-suppressions=all`       | Ignore specific known issues or false positives. |\n| `--suppressions=readline.supp` | Specifies the path to a suppression file.        |\n| `--log-file=memleaks.log`      | Sets the name of the file.                       |\n\n\u003e To ignore leaks related to the `readline` and `add_history` functions, create a file called `readline.supp` with the following content:\n```\n{\n    leak readline\n    Memcheck:Leak\n    ...\n    fun:readline\n}\n{\n    leak add_history\n    Memcheck:Leak\n    ...\n    fun:add_history\n}\n```\n\n`valgrind --suppressions=readline.supp --leak-check=full --show-leak-kinds=all ./minishell`\n\n## UTILITIES\n#### Return Values ($?)\n\u003e The values that a function returns when it completes.\n\n* All Linux commands return an error code between `0` and `255`.\n* The value 0 represents the value true (command success).\n* Values greater than 0 represent false (command failure).\n* The error code of the last command used is contained in the variable `$?`.\n\n| $?      | Description                                                                             |\n| :------ | :-------------------------------------------------------------------------------------- |\n| `1`     | Standard for general errors, such as a division by zero.                                |\n| `2`     | Improper use of built-in commands, per Bash documentation.                              |\n| `126`   | The command called cannot be executed, rights problem or the command is not executable. |\n| `127`   | Command not found, possible problem with $PATH or typing error.                         |\n| `128`   | Invalid command argument.                                                               |\n| `128+n` | 128 + signal number.                                                                    |\n| `130`   | Finished with `Ctrl` + `C` (130 = 128 + 2).                                             |\n| `255`   | Exit code out of bounds. Example: `exit -1`.                                            |\n\n#### Command Reminders\n\u003e More nice-to-know commands that may be useful in the future.\n\n| Command       | Description                                                                                 |\n| :------------ | :------------------------------------------------------------------------------------------ |\n| `yes`\t\t| Writes in an infinite loop `yes teste`.                                                     |\n| `ln`\t\t| Bind a file or directory.                                                                   |\n| `chmod`\t| Change file permissions `chmod 777` (all permissions) `chmod 000` (no permissions).         |\n| `cd`\t\t| Change directory. `cd -` (last visited directory) `cd` (user directory) `cd /` (root).      |\n| `clear`\t| Clear the screen.                                                                           |\t\n| `diff`\t| Compare files line by line.                                                                 |\n| `cmp`\t\t| Write the first line of difference between 2 files.                                         |\n| `pc`\t\t| Copying files.                                                                              |\n| `rm`\t\t| Delete file.                                                                                |\n| `rm -rf`\t| Delete the directory recursively.                                                           |\n| `ls -l`\t| Show the contents of the directory.                                                         |\n| `exit`\t| Exit current process.                                                                       |\n| `grep`\t| Search for strings in files `grep \"printf\" file`.                                           |\n| `mkdir`\t| Create a directory.                                                                         |\n| `rmdir`\t| Delete a directory.                                                                         |\n| `more`\t| Displays a file page by page as in a man.                                                   |\n| `mv`\t\t| Move or rename.                                                                             |\n| `$PATH`\t| Path to executables.                                                                        |\n| `cat`\t\t| Send the file to stdout.                                                                    |\n\n#### CHMOD\n\u003e Change the access permissions and the special mode flags of file system objects.\n\n| Rights        | Number |\n| :------------ | :----- |\n| `r` (read)\t| `4`    |\n| `w` (write)\t| `2`    |\n| `x` (execute)\t| `1`    |\n\t\n| Rights  | Calculation | Total |\n| :------ | :---------- | :---- |\n| `---`   | `0+0+0`     | `0`   |\n| `r--`   | `4+0+0`     | `4`   |\n| `-w-`   | `0+2+0`     | `2`   |\n| `--x`   | `0+0+1`     | `1`   |\n| `rw-`   | `4+2+0`     | `6`   |\n| `-wx`   | `0+2+1`     | `3`   |\n| `x-ray` | `4+0+1`     | `5`   |\n| `rwx`   | `4+2+1`     | `7`   |\n\n#### DATA TYPES\n\u003e All data types, their size in bytes and the INT MIN and INT MAX range.\n\n| Data Types | Qualifiers                        | Size (in byte) | Range                          |\n| :--------- | :-------------------------------- | :------------- | :----------------------------- |\n| `char`     | `char` or `signed char`\t\t | `1`            | `-128` to `127`                |\n| `char`     | `unsigned char`\t\t\t | `1`            | `0` to `255`                   |\n| `int`\t     | `int` or `signed int`\t\t | `4`            | `-2147483648` to `2147483647`  |\n| `int`\t     | `unsigned int`\t\t\t | `4`            | `0` to `4294967295`            |\n| `int`\t     | `short int` or `short signed int` | `2`            | `-32768` to `32767`            |\n| `int`\t     | `unsigned short int`\t\t | `2`            | `0` to `65535`                 |\n| `int`\t     | `long int` or `signed long int`\t | `4`            | `-2147483648` to `2147483647`  |\n| `int`\t     | `unsigned long int`\t\t | `4`            | `0` to `4294967295`            |\n| `float`    | `float`\t\t\t\t | `4`            | `1.1754e-38` to `3.4028e+38`   |\n| `float`    | `double`\t\t\t\t | `8`            | `2.2250e-308` to `1.7976e+308` |\n| `float`    | `long double`\t\t\t | `10`           | `3.4E-4932` to `3.4E+4932`     |\n\n## COMMAND EXAMPLES\n\u003e Some example commands that can be tested on minishell or break it.\n\n| Status  | Definition |\n| :------ | :--------- |\n| 🟢 | Working.                     |\n| 🟡 | Didn't test yet.             |\n| 🟣 | Leaks or segmentation fault. |\n| ⚪ | Weird behaviour.             |\n| 🔴 | Not working.                 |\n| 🔵 | Not mandatory.               |\n\n#### BLANK\n\u003e Exploring fundamental commands in Minishell, unravelling the core of shell interactions.\n\n| Status  | Command |\n| :------ | :------ |\n| 🟢 | `\u003cempty\u003e`  |\n| 🟢 | `\u003cspaces\u003e` |\n| 🟢 | `../../`   |\n| 🟢 | `$`        |\n\n#### SIGNALS\n\u003e Understanding system signals, showcasing the shell's adaptability in various scenarios.\n\n| Status  | Command |\n| :------ | :------ |\n| 🟢 | `Ctrl` + `C`                                |\n| 🟢 | `Ctrl` + `D`                                |\n| 🟢 | `Ctrl` + `\\`                                |\n| 🟢 | `write something then press` + `Ctrl` + `C` |\n| 🟢 | `write something then press` + `Ctrl` + `D` |\n| 🟢 | `write something then press` + `Ctrl` + `\\` |\n| 🟢 | `cat` + `Ctrl` + `C`                        |\n| 🟢 | `cat` + `Ctrl` + `D`                        |\n| 🟢 | `cat` + `Ctrl` + `\\`                        |\n| 🟢 | `sleep 5` + `Ctrl` + `C`                    |\n| 🟢 | `sleep 5` + `Ctrl` + `D`                    |\n| 🟢 | `sleep 5` + `Ctrl` + `\\`                    |\n\t\n#### PATH\n\u003e Managing executable file access by manipulating the system path in Minishell.\n\n| Status  | Command |\n| :------ | :------ |\n| 🟢 | `/bin/echo`        |\n| 🟢 | `/bin/grep`        |\n| 🟢 | `/bin/ls`          |\n| 🟢 | `/bin/ls -la`      |\n| 🟢 | `/bin/cat`         |\n| 🟢 | `/bin/pwd`         |\n| 🟢 | `/bin/cd`          |\n| 🟢 | `/bin/export`      |\n| 🟢 | `/bin/env`         |\n| 🟢 | `/bin/exit`        |\n\n#### PWD\n\u003e Locating the present directory through the pwd command in Minishell.\n\n| Status  | Command |\n| :------ | :------ |\n| 🟢 | `pwd`         |\n| 🟢 | `pwd a`       |\n| 🟢 | `pwd a b c d` |\n\n#### EXPORT, ENV AND UNSET\n\u003e Harnessing environment variables via export, env, and unset commands in Minishell.\n\n| Status  | Command |\n| :------ | :------ |\n| 🟢 | `ENV`                        \t|\n| 🟢 | `eNv`                        \t|\n| 🟢 | `env`                        \t|\n| 🟢 | ` env`                       \t|\n| 🟢 | `env `                       \t|\n| 🟢 | `  env  `                    \t|\n| 🟢 | `UNSET`                      \t|\n| 🟢 | `uNsEt`                      \t|\n| 🟢 | `unset`                      \t|\n| 🟢 | ` unset`                     \t|\n| 🟢 | `unset `                     \t|\n| 🟢 | `  unset  `                  \t|\n| 🟢 | `unset [variable]`           \t|\n| 🟢 | `unset [variable] [variable]`\t|\n| 🟢 | `unset [all variables]`      \t|\n| 🟢 | `EXPORT`                     \t|\n| 🟢 | `eXpOrT`                     \t|\n| 🟢 | `export`                     \t|\n| 🟢 | ` export`                    \t|\n| 🟢 | `export `                    \t|\n| 🟢 | `  export  `                 \t|\n| 🟢 | `export a=42`                \t|\n| 🟢 | `export a=24`\t\t    \t|\n| 🟢 | `export b=42`                \t|\n| 🟢 | `export a = 42`              \t|\n| 🟢 | `export a=\" 42 \"`            \t|\n| 🟢 | `export a=' 42 '`            \t|\n| 🟢 | `export a = 42`              \t|\n| 🟢 | `export a` \t\t    \t|\n| 🟢 | `export a=''`           \t    \t|                                         \n| 🟢 | `export a='\"'`               \t|                                   \n| 🟢 | `export a='\\'`               \t|                                \n| 🟢 | `export a='$'`               \t|                                 \n| 🟢 | `export a='\\t'`              \t|                                    \n| 🟢 | `export a='''` \t\t \t| \n| 🟢 | `export =` \t\t  \t|\n| 🟢 | `export ==`\t\t  \t|\n| 🟢 | `export a=` \t\t  \t|\n| 🟢 | `export a=42=` \t\t    \t|\n| 🟢 | `export =a=42` \t\t    \t|\n| 🟢 | `export a==42` \t\t    \t|\n| 🟢 | `export \"a=42\"` \t\t    \t|\n| 🟢 | `export a=\"42\"` \t\t    \t|\n| 🟢 | `export _=42` \t\t    \t|\n| 🟢 | `export 42=42`\t\t    \t|\n| 🟢 | `export a b = 42`\t    \t|\n| 🟢 | `export a= b= 42`\t    \t|\n| 🟢 | `export a=42 % b=42 @ c=42`  \t|\n| 🟢 | `export a=42 b=42 c=42`\t    \t|\n| 🟢 | `export A=a B=b C=c D=d E=e` \t|\n| 🟢 | `export F=f G=g H=h I=i J=j` \t|\n| 🟢 | `export K=k L=l M=m N=n O=o` \t|\n| 🟢 | `export P=p Q=q R=r S=s T=t` \t|\n| 🟢 | `export U=u V=v W=w X=x Y=y Z=z` |\n| 🟢 | `export _=a; echo $_a` \t\t|\n\n#### EXIT\n\u003e Concluding Minishell's operations gracefully using the exit command.\n\n| Status  | Command |\n| :------ | :------ |\n| 🟢 | `EXIT`                      |\n| 🟢 | `eXiT`                      |\n| 🟢 | `exit`                      |\n| 🟢 | `exit `                     |\n| 🟢 | ` exit`                     |\n| 🟢 | `  exit  `                  |\n| 🟢 | `exit test`                 |\n| 🟢 | `exit \"test\"`               |\n| 🟢 | `\"exit test\"`               |\n| 🟢 | `\"exit\"`                    |\n| 🟢 | `exit1`                     |\n| 🟢 | `exita`                     |\n| 🟢 | `exit exit`                 |\n| 🟢 | `exit a`                    |\n| 🟢 | `exit abc`                  |\n| 🟢 | `exit a b c`                |\n| 🟢 | `exit a b c d`              |\n| 🟢 | `exit #`                    |\n| 🟢 | `exit *`                    |\n| 🟢 | `exit 0`                    |\n| 🟢 | `exit 1`                    |\n| 🟢 | `exit 123`                  |\n| 🟢 | `exit 1234`                 |\n| 🟢 | `exit 1 2 3 4`              |\n| 🟢 | `exit +`                    |\n| 🟢 | `exit -`                    |\n| 🟢 | `exit +10`                  |\n| 🟢 | `exit -10`                  |\n| 🟢 | `exit +2000`                |\n| 🟢 | `exit -2000`                |\n| 🟢 | `exit +-2000`               |\n| 🟢 | `exit -+2000`               |\n| 🟢 | `exit ++2000`               |\n| 🟢 | `exit --2000`               |\n| 🟢 | `exit -2147483649`          |\n| 🟢 | `exit 2147483648`           |\n| 🟢 | `exit 00000000000000000000` |\n| 🟢 | `exit 11111111111111111111` |\n| 🟢 | `exit'42'`                  |\n| 🟢 | `exit '\\t42'`               |\n| 🟢 | `exit '\\t\\f\\r 42'`          |\n| 🟢 | `exit '42 '`                |\n| 🟢 | `exit '42\\t'`               |\n| 🟢 | `exit '42\\r'`               |\n| 🟢 | `exit '42\\t\\f\\r '`          |\n| 🟢 | `exit '42     a'`           |\n| 🟢 | `exit '42\\t\\t\\ta'`          | \n\n#### CD\n\u003e Traversing directories seamlessly using the cd command in Minishell.\n\n| Status  | Command |\n| :------ | :------ |\n| 🟢 | `CD`                    |\n| 🟢 | `cd`                    |\n| 🟢 | `cd `                   |\n| 🟢 | ` cd`                   |\n| 🟢 | `  cd  `                |\n| 🟢 | `cd .`                  |\n| 🟢 | `cd ~`                  |\n| 🟢 | `cd no_file`            |\n| 🟢 | `cd1`                   |\n| 🟢 | `cd 0`                  |\n| 🟢 | `cd 1`                  |\n| 🟢 | `cd 123`                |\n| 🟢 | `cd 1234`               |\n| 🟢 | `cd 1 2 3 4`            |\n| 🟢 | `cd cd`                 |\n| 🟢 | `cd a`                  |\n| 🟢 | `cd abc`                |\n| 🟢 | `cd a b c`              |\n| 🟢 | `cd a b c d`            |\n| 🟢 | `cd ../../`             |\n| 🟢 | `cd ../../../../../../` |\n| 🟢 | `cd ../../...`          |\n| 🟢 | `cd .../../..`          |\n| 🟢 | `cd .../../...`         |\n| 🟢 | `cd \\`                  |\n| 🟢 | `cd /`                  |\n| 🟢 | `cd //`                 |\n| 🟢 | `cd ///`                |\n| 🟢 | `cd -`                  |\n| 🟢 | `cd $[VAR]`             |\n\n#### ECHO\n\u003e Rendering text and variables in the terminal with the versatile echo command in Minishell.\n\n| Status  | Command |\n| :------ | :------ |\n| 🟢 | `ECHO`                                                               |\n| 🟢 | `echO`                                                               |\n| 🟢 | `ECHo`                                                               |\n| 🟢 | `echo`                                                               |\n| 🟢 | `echo echo`                                                          |\n| 🟢 | `echo `                                                              |\n| 🟢 | ` echo`                                                              |\n| 🟢 | `  echo  `                                                           |\n| 🟢 | `echo .`                                                             |\n| 🟢 | `echo ~`                                                             |\n| 🟢 | `echo echo ~`                                                        |\n| 🟢 | `\"echo test\"`                                                        |\n| 🟢 | `echo \"~\"`                                                           |\n| 🟢 | `echo '~'`                                                           |\n| 🟢 | `echo ~123`                                                          |\n| 🟢 | `echo 123~`                                                          |\n| 🟢 | `echo ~/123`                                                         |\n| 🟢 | `echo ~/123/456`                                                     |\n| 🟢 | `echo #`                                                             |\n| 🟢 | `echofile`                                                           |\n| 🟢 | `echo file`                                                          |\n| 🟢 | `echo no_file`                                                       |\n| 🟢 | `echo file test`                                                     |\n| 🟢 | `echo file   test`                                                   |\n| 🟢 | `echo file     test file   test`                                     |\n| 🟢 | `echo a\"b\"c`                                                         |\n| 🟢 | `echo \"a'b'c`                                                        |\n| 🟢 | `echo \"test\"`                                                        |\n| 🟢 | `echo test`                                                          |\n| 🟢 | `echo 'test'`                                                        |\n| 🟢 | `echo -n`                                                            |\n| 🟢 | `echo -n -n -n -n`                                                   |\n| 🟢 | `echo -nnnnnnnnnnnnnnnnnnnnnnnn`                                     |\n| 🟢 | `echo -n test -n`                                                    |\n| 🟢 | `\"echo\" \"-n\"`                                                        |\n| 🟢 | `echo -n test`                                                       |\n| 🟢 | `echo -nn test`                                                      |\n| 🟢 | `echo -n -n -n test`                                                 |\n| 🟢 | `echo \"-n\" test`                                                     |\n| 🟢 | `echo -n\"-n\" test`                                                   |\n| 🟢 | `echo \"-nnnn\" test`                                                  |\n| 🟢 | `echo \"-n -n -n\"-n test`                                             |\n| 🟢 | `echo \"-n '-n'\" test `                                               |\n| 🟢 | `echo -n file test`                                                  |\n| 🟢 | `echo -n -n -n file test`                                            |\n| 🟢 | `echo $USER`                                                         |\n| 🟢 | `echo \"$USER\"`                                                       |\n| 🟢 | `echo \"'$USER'\"`                                                     |\n| 🟢 | `echo \" '$USER' \"`                                                   |\n| 🟢 | `echo text\"$USER\"`                                                   |\n| 🟢 | `echo text\"'$USER'\" ' $USER '`                                       |\n| 🟢 | `echo \"text\"   \"$USER\"    \"$USER\"`                                   |\n| 🟢 | `echo '              $USER          '`                               |\n| 🟢 | `echo               text \"$USER\"            \"$USER\"text`             |\n| 🟢 | `echo ''''''''''$USER''''''''''`                                     |\n| 🟢 | `echo \"\"\"\"\"\"\"\"$USER\"\"\"\"\"\"\"\"`                                         |\n| 🟢 | `echo $USER'$USER'text oui oui     oui  oui $USER oui      $USER ''` |\n| 🟢 | `echo $USER '' $USER $USER '' $USER '' $USER -n $USER`               |\n| 🟢 | `echo ' \\' ' \\'`                                                     |\n| 🟢 | `echo '\\\" ' \" \\\"\\\"\"`                                                 |\n| 🟢 | `echo \\\\\\\" \\\\\\\" \\\\\\\" \\\\\\\"\\\\\\\"\\\\\\\" \\\\\\'\\\\\\'\\\\\\'`                      |\n| 🟢 | `echo \"$USER\"\"$USER\"\"$USER\"`                                         |\n| 🟢 | `echo text\"$USER\"test`                                               |\n| 🟢 | `echo '$USER' \"$USER\" \"text \\' text\"`                                |\n| 🟢 | `echo '$USER'`                                                       |\n| 🟢 | `echo $USER \" \"`                                                     |\n| 🟢 | `echo \"$USER\"\"Users/$USER/file\"\"'$USER'\"'$USER'`                     |\n| 🟢 | `echo \"$USER$USER$USER\"`                                             |\n| 🟢 | `echo '$USER'\"$USER\"'$USER'`                                         |\n| 🟢 | `echo '\"$USER\"''$USER'\"\"\"$USER\"`                                     |\n| 🟢 | `echo \" $USER  \"'$PWD'`                                              |\n| 🟢 | `echo \" $USER  \\$ \"'$PWD'`                                           |\n| 🟢 | `echo $USER=4`                                                       |\n| 🟢 | `echo $USER=thallard`                                                |\n| 🟢 | `echo $USER`                                                         |\n| 🟢 | `echo $?`                                                            |\n| 🟢 | `echo $USER213`                                                      |\n| 🟢 | `echo $USER$12USER$USER=4$USER12`                                    |\n| 🟢 | `echo $USER $123456789USER $USER123456789`                           |\n| 🟢 | `echo $USER $9999USER $8888USER $7777USER`                           |\n| 🟢 | `echo $USER $USER9999 $USER8888 $USER7777`                           |\n| 🟢 | `echo $USER $USER9999 $USER8888 $USER7777 \"$USER\"`                   |\n| 🟢 | `echo \"$USER=12$USER\"`                                               |\n| 🟢 | `echo \"$9USER\" \"'$USER=12$SOMETHING'\"`                               |\n| 🟢 | `echo $PWD/file`                                                     |\n| 🟢 | `echo \"$PWD/file`                                                    |\n| 🟢 | `echo \"text\" \"text$USER\" ... \"$USER`                                 |\n| 🟢 | `echo $PW`                                                           |\n| 🟢 | `echo \"'\"'ola'\"'\"`                                                   |\n| 🟢 | `echo \"'\"' ola '\"'\"`                                                 |\n\n## NORMINETTE\n\u003e At 42 School, it is expected that almost every project is written following the Norm, which is the coding standard of the school.\n\n```\n- No for, do...while, switch, case, goto, ternary operators, or variable-length arrays allowed;\n- Each function must be a maximum of 25 lines, not counting the function's curly brackets;\n- Each line must be at most 80 columns wide, with comments included;\n- A function can take 4 named parameters maximum;\n- No assigns and declarations in the same line (unless static);\n- You can't declare more than 5 variables per function;\n- ...\n```\n\n* [42 Norms](https://github.com/42School/norminette/blob/master/pdf/en.norm.pdf) - Information about 42 code norms. `PDF`\n* [Norminette](https://github.com/42School/norminette) - Tool to respect the code norm, made by 42. `GitHub`\n* [42 Header](https://github.com/42Paris/42header) - 42 header for Vim. `GitHub`\n\n## CONTRIBUTING\n\nIf you find any issues or have suggestions for improvements, feel free to fork the repository and open an issue or submit a pull request.\n\n## LICENSE\n\nThis project is available under the MIT License. For further details, please refer to the [LICENSE](https://github.com/jotavare/minishell/blob/master/LICENSE) file.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjotavare%2Fminishell","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjotavare%2Fminishell","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjotavare%2Fminishell/lists"}