Customising PS1 to Include a Shell Script

Today – instead of making actual progress in the course – I got lost in the supplementary reading about setting yourself up with a custom prompt. Since most shells come pre-configured with many of the ideas of the blog post already implemented, the only option that really caught my attention was using a shell script inside the PS1 variable. The example given was a script to count the size of regular files in the current directory and show it next to the prompt. I was more interested in the total size of the current directory, including all files in subdirectories, so I set out to try that. This post is more of an answer to the call to post one’s progress, than an actual offer of useful code, since I still don’t deem having the filesize shown important enough to incorporate into my personal prompt.

Step by Step to a Prompt Which Displays File Size

Finished Product First

All this produces is a simple addendum to the prompt, displaying the size of the files in the current directory and its subdirectories. Can be placed anywhere in the custom prompt:

[X bytes]

The Bash Script

To achieve this, one has to write a bash script to recursively sum up filesizes:

#!/bin/bash

calculate_size() {
  local directory=$1
  local totalsize=0

  for filesize in $(find "$directory" -type f -exec stat -c %s {} \; 2>/dev/null); do
    ((totalsize += filesize))
  done

  for subdir in $(find "$directory" -type d); do
    if [[ "$subdir" != "$directory" ]]; then
      ((totalsize += $(calculate_size "$subdir")))
    fi
  done

  echo "$totalsize"
}

# Usage example
total=$(calculate_size .)
echo "$total bytes"

Adding the Script to PATH

After making the script executable, one has to include the script itself or its folder into PATH. This can be done by including the following line in ~/.bashrc, which is where customisation is done on my Ubuntu LTS server, or in whatever file is the correct one for your distribution.

export PATH="$PATH:/path/to/script.sh" or

export PATH="$PATH:/path/to/scripts/folder"

Customising PS1

Find PS1 in whatever customisation file it is defined in on your system, and add the following snippet anywhere, where you would like the file size to be displayed.

[$(path/to/your/script.sh)]

Notes

  • The Bash script was in part written by me with the knowledge I gained from a previous shell scripting course, and in part written and refined by ChatGPT 3.5
  • This by no means has to be the most elegant way to calculate total file size, I am new to shell scripting
  • There might very well be cases where the script fails due to special characters or other unexpected input, it has no error catching mechanisms
  • It could be further refined to show sizes in bytes/kilobytes/megabytes/… according to the total calculated
  • Unfortunately, Lemmy does not seem to support syntax highlighting for code blocks

tl;dr

I talked about how to customise the PS1 prompt in a shell to display the total size of files in the current directory and its subdirectories. This is done by creating a Bash script to calculate the total file size and incorporating it into the PS1 variable. The script should be added to the PATH and the PS1 should be modified to display the file size information.

  • wyrmroot
    link
    fedilink
    English
    arrow-up
    2
    ·
    1 year ago

    Awk is a great tool to have in your bag, I’m glad you find it interesting. A note on your use case, though - if all you are doing is printing one column, cut -f 1 is likely more performant.