From 0df8fbe847527cd27f784f236bf722ee1f85e868 Mon Sep 17 00:00:00 2001 From: Ravisankar Pandian Date: Fri, 21 Nov 2025 18:13:12 +0530 Subject: [PATCH] Added BASH Prompt customization --- src/content/docs/tips/customizeTerminals.mdx | 210 ++++++++++++++++++ .../tips/images/advanced_terminal_mod.png | Bin 0 -> 7011 bytes .../docs/tips/images/basic_terminal_mod.png | Bin 0 -> 7844 bytes 3 files changed, 210 insertions(+) create mode 100644 src/content/docs/tips/customizeTerminals.mdx create mode 100644 src/content/docs/tips/images/advanced_terminal_mod.png create mode 100644 src/content/docs/tips/images/basic_terminal_mod.png diff --git a/src/content/docs/tips/customizeTerminals.mdx b/src/content/docs/tips/customizeTerminals.mdx new file mode 100644 index 0000000..f035b8f --- /dev/null +++ b/src/content/docs/tips/customizeTerminals.mdx @@ -0,0 +1,210 @@ +--- +title: "Customizing your PASE Terminal Prompt" +description: "Learn how to customize your PASE terminal prompt to display useful information like username, server name, current directory, and Git status" +tags: ["PASE", "terminal", "git", "customization", "shell", "tips"] +--- + +import { Icon } from '@astrojs/starlight/components'; + + +Modification of the prompt string to display useful details in the PASE terminal can greatly improve your workflow and productivity. This guide will show you two methods to customize your terminal prompt: a simple method for basic information display, and an advanced method that includes Git status integration. + +## Why Customize Your Terminal Prompt? + +A customized terminal prompt helps you: +- Know exactly where you're currently located without issuing a `pwd` command +- See Git repository status at a glance +- Identify the server and user you're working as +- Reduce context switching and improve efficiency + +## Prerequisites + +- Access to IBM i PASE terminal +- Basic knowledge of shell commands +- For the advanced method: Git installed in PASE + +--- + +## Simple Method: Basic PS1 Customization + +By modifying the `PS1` environment variable, we can display useful information like username, server name, and current working directory. + +![Simple Terminal Prompt](./images/basic_terminal_mod.png) + +This customization helps users know exactly where they're currently located without the need to issue a `pwd` command. + +### Implementation + +Create a `.profile` file in your home directory with the following command: + +```bash +echo 'PS1="\[\e[32m\]\u\[\e[0m\]@\[\e[32m\]\h\[\e[33m\]:\w\[\e[0m\]\$ "' >> ~/.profile +``` + +Then reload your profile: + +```bash +source ~/.profile +``` + +### What This Does + +- `\u` - Displays the username (in green) +- `@` - Separator +- `\h` - Displays the hostname (in green) +- `:` - Separator +- `\w` - Displays the current working directory (in yellow) +- `\$` - Displays `$` for regular users or `#` for root + +--- + +## Advanced Method: Git Status Integration + +By modifying the `PROMPT_COMMAND`, we can display the Git status directly on the prompt string. This replicates functionality similar to [posh-git](https://github.com/dahlbyk/posh-git) for PowerShell. + +![Advanced Terminal Prompt with Git Status](./images/advanced_terminal_mod.png) + +In this example: +- `gitrepo` - Current folder name (which is a Git repository) +- `master` (cyan) - Current branch name +- `?` - No remote repository configured +- `+1` (green) - One file is tracked and newly added +- `+2` (red) - Two files are added but untracked + +### Step 1: Download the git-prompt.sh Script + +First, get the `git-prompt.sh` shell script that can evaluate the Git status. You can read more about this script [here](https://github.com/lyze/posh-git-sh). + +```bash +/QOpenSys/pkgs/bin/wget --show-progress https://raw.githubusercontent.com/lyze/posh-git-sh/refs/heads/master/git-prompt.sh -O ~/.git-prompt.sh +``` + +### Step 2: Setup the Open Source PATH Variable + +Add the open source path to your `.profile` file. This is required for the `git-prompt.sh` to work correctly. + +```bash +echo "export PATH=/QOpenSys/pkgs/bin:$PATH" >> ~/.profile +``` + +### Step 3: Configure PROMPT_COMMAND + +Setup the `PROMPT_COMMAND` to reflect the Git status. Run the following commands one by one: + +```bash +echo "PROMPT_COMMAND='__posh_git_ps1 \"\${VIRTUAL_ENV:+(\`basename \$VIRTUAL_ENV\`)}\\[\\e[32m\\]\\u\\[\\e[0m\\]@\\h:\\[\\e[33m\\]\\w\\[\\e[0m\\] \" \"\\\\\\\$ \";'\$PROMPT_COMMAND" >> ~/.profile +``` + +```bash +echo "source ~/.git-prompt.sh" >> ~/.profile +``` + +```bash +source ~/.profile +``` + +### How It Works + +The `PROMPT_COMMAND` is a special shell variable that gets executed each time before the shell's primary prompt (PS1) is displayed. We instruct it to call the `git-prompt.sh` script every time the prompt is displayed. + +The function `__posh_git_ps1` takes two parameters: `__posh_git_ps1 `, and sets `PS1` to ``. + +--- + +## Understanding Git Status Symbols + +
+Click here to read the full legend of the Git Prompt + +By default, the status summary has the following format: + +``` +[{HEAD-name} x +A ~B -C !D | +E ~F -G !H W] +``` + +### HEAD Name and Colors + +**`{HEAD-name}`** is the current branch, or the SHA of a detached HEAD. The color of `{HEAD-name}` represents the divergence from upstream: + +- **`cyan`** - the branch matches its remote +- **`green`** - the branch is ahead of its remote (green light to push) +- **`red`** - the branch is behind its remote +- **`yellow`** - the branch is both ahead of and behind its remote + +### Divergence Symbols + +**`x`** is a symbol that represents the divergence from upstream: + +- **`≡`** - the branch matches its remote +- **`↑`** - the branch is ahead of its remote +- **`↓`** - the branch is behind its remote +- **`↕`** - the branch is both ahead of and behind its remote + +### Status Changes + +Status changes are indicated by prefixes to `A` through `H`: +- `A` through `D` represent counts for the **index** (dark green) +- `E` through `H` represent counts for the **working directory** (dark red) + +**Prefixes:** +- **`+`** - added +- **`~`** - modified +- **`-`** - removed +- **`!`** - conflicting + +### Working Directory Status + +**`W`** represents the overall status of the working directory: + +- **`!`** - there are unstaged changes in the working tree +- **`~`** - there are uncommitted changes (staged changes waiting to be committed) +- **None** - there are no unstaged or uncommitted changes + +### Example + +A status of `[master ≡ +0 ~2 -1 | +1 ~1 -0 !]` corresponds to the following `git status`: + +``` +# On branch master +# +# Changes to be committed: +# (use "git reset HEAD ..." to unstage) +# +# modified: this-changed.txt +# modified: this-too.txt +# deleted: gone.txt +# +# Changed but not updated: +# (use "git add ..." to update what will be committed) +# (use "git checkout -- ..." to discard changes in working directory) +# +# modified: not-staged.txt +# +# Untracked files: +# (use "git add ..." to include in what will be committed) +# +# new.txt +``` + +
+ +--- + +## Tips & Best Practices + +1. **Backup your `.profile`** before making changes: `cp ~/.profile ~/.profile.backup` +2. **Test in a new session** after making changes to ensure everything works correctly +3. **Keep it readable** - Don't overcrowd your prompt with too much information +4. **Consider performance** - The Git status check runs on every prompt display, which might slow down your terminal in large repositories +5. **Customize colors** - Modify the ANSI color codes to match your preferences + +--- + +## References + +- [posh-git-sh on GitHub](https://github.com/lyze/posh-git-sh) +- [posh-git for PowerShell](https://github.com/dahlbyk/posh-git) +- [Bash Prompt HOWTO](https://tldp.org/HOWTO/Bash-Prompt-HOWTO/) + +--- + diff --git a/src/content/docs/tips/images/advanced_terminal_mod.png b/src/content/docs/tips/images/advanced_terminal_mod.png new file mode 100644 index 0000000000000000000000000000000000000000..20e60c0a4f4f157e0910b18f0a3719d605ad00f4 GIT binary patch literal 7011 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 literal 0 HcmV?d00001 diff --git a/src/content/docs/tips/images/basic_terminal_mod.png b/src/content/docs/tips/images/basic_terminal_mod.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6964953c169d2c249e4ca72ccf4db14dc1c6d0 GIT binary patch literal 7844 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 literal 0 HcmV?d00001