## File: README.md Oh My Bash is an open source, community-driven framework for managing your [bash](https://www.gnu.org/software/bash/) configuration. Sounds boring. Let's try again. Oh My Bash will not make you a 10x developer...but you might feel like one. Once installed, your terminal shell will become the talk of the town or your money back! With each keystroke in your command prompt, you'll take advantage of the hundreds of powerful plugins and beautiful themes. Strangers will come up to you in cafés and ask you, "that is amazing! are you some sort of genius?" Finally, you'll begin to get the sort of attention that you have always felt you deserved. ...or maybe you'll use the time that you're saving to start flossing more often. ## Getting Started ### Prerequisites __Disclaimer:__ _Oh My Bash works best on macOS and Linux._ * Unix-like operating system (macOS or Linux) * `curl` or `wget` should be installed * `git` should be installed ### Basic Installation Oh My Bash is installed by running one of the following commands in your terminal. You can install this via the command-line with either `curl` or `wget`. #### via curl ```shell bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)" ``` #### via wget ```shell bash -c "$(wget https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh -O -)" ``` This replaces `~/.bashrc` with the version provided by Oh My Bash. The original `.bashrc` is backed up with the name `~/.bashrc.omb-TIMESTAMP`. If `~/.bash_profile` does not exist, this also creates a new file `~/.bash_profile` with the default contents. ⚠️ If `~/.bash_profile` already existed before Oh My Bash is installed, please make sure that`~/.bash_profile` contains the line `source ~/.bashrc` or `. ~/.bashrc`. If not, please add the following three lines in `~/.bash_profile`: ```bash if [[ -f ~/.bashrc ]]; then source ~/.bashrc fi ``` ## Using Oh My Bash ### Plugins Oh My Bash comes with a shit load of plugins to take advantage of. You can take a look in the [plugins](https://github.com/ohmybash/oh-my-bash/tree/master/plugins) directory and/or the [wiki](https://github.com/ohmybash/oh-my-bash/wiki/Plugins) to see what's currently available. #### Enabling Plugins Once you spot a plugin (or several) that you'd like to use with Oh My Bash, you'll need to enable them in the `.bashrc` file. You'll find the bashrc file in your `$HOME` directory. Open it with your favorite text editor and you'll see a spot to list all the plugins you want to load. For example, this line might begin to look like this: ```shell plugins=(git bundler osx rake ruby) ``` ##### With Conditionals You may want to control when and/or how plugins should be enabled. For example, if you want the `tmux-autoattach` plugin to only run on SSH sessions, you could employ a trivial conditional that checks for the `$SSH_TTY` variable. Just make sure to remove the plugin from the larger plugin list. ``` bash [ "$SSH_TTY" ] && plugins+=(tmux-autoattach) ``` #### Using Plugins Most plugins (should! we're working on this) include a __README__, which documents how to use them. ### Themes We'll admit it. Early in the Oh My Bash world, we may have gotten a bit too theme happy. We have over one hundred themes now bundled. Most of them have [screenshots](https://github.com/ohmybash/oh-my-bash/wiki/Themes) on our wiki or alternatively [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh/wiki/themes) wiki. #### Selecting a Theme _The font theme is the default one. It's not the fanciest one. It's not the simplest one. It's just the right one for the original maintainer of Oh My Bash._ Once you find a theme that you want to use, you will need to edit the `~/.bashrc` file. You'll see an environment variable (all caps) in there that looks like: ```shell OSH_THEME="font" ``` To use a different theme, simply change the value to match the name of your desired theme. For example: ```shell OSH_THEME="agnoster" # (this is one of the fancy ones) # you might need to install a special Powerline font on your console's host for this to work # see https://github.com/ohmybash/oh-my-bash/wiki/Themes#agnoster ``` Open up a new terminal window and your prompt should look something like this: In case you did not find a suitable theme for your needs, please have a look at the wiki for [more of them](https://github.com/ohmybash/oh-my-bash/wiki/Themes). If you're feeling feisty, you can let the computer select one randomly for you each time you open a new terminal window. ```shell OSH_THEME="random" # (...please let it be pie... please be some pie..) ``` If you want to randomly select a theme from a specified list, you can set the list in the following array: ```shell OMB_THEME_RANDOM_CANDIDATES=("font" "powerline-light" "minimal") ``` If there are themes you don't like, you can add them to an ignored list: ```shell OMB_THEME_RANDOM_IGNORED=("powerbash10k" "wanelo") ``` The selected theme name can be checked by the following command: ```shell $ echo "$OMB_THEME_RANDOM_SELECTED" ``` ## Advanced Topics If you're the type that likes to get their hands dirty, these sections might resonate. ### Advanced Installation Some users may want to change the default path, or manually install Oh My Bash. #### Custom Directory The default location is `~/.oh-my-bash` (hidden in your home directory) If you'd like to change the install directory with the `OSH` environment variable, either by running `export OSH=/your/path` before installing, or by setting it before the end of the install pipeline like this: ```shell export OSH="$HOME/.dotfiles/oh-my-bash"; bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)" ``` #### Unattended install If you're running the Oh My Bash install script as part of an automated install, you can pass the flag `--unattended` to the `install.sh` script. This will have the effect of not trying to change the default shell, and also won't run `bash` when the installation has finished. ```sh bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)" --unattended ``` #### System-wide installation For example, Oh My Bash can be installed to `/usr/local/share/oh-my-bash` for the system-wide installation by specifying the option `--prefix=PREFIX`. ```sh bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)" --prefix=/usr/local ``` To enable Oh My Bash, the Bash startup file `.bashrc` needs to be manually set up by each user. The template of `.bashrc` is available in `PREFIX/share/oh-my-bash/bashrc`. The users can copy the template file to `~/.bashrc` and edit it. ```bash cp /usr/local/share/oh-my-bash/bashrc ~/.bashrc ``` #### Manual Installation ##### 1. Clone the repository: ```shell git clone https://github.com/ohmybash/oh-my-bash.git ~/.oh-my-bash ``` ##### 2. *Optionally*, backup your existing `~/.bashrc` file: ```shell cp ~/.bashrc ~/.bashrc.orig ``` ##### 3. Create a new sh configuration file You can create a new sh config file by copying the template that we have included for you. ```shell cp ~/.oh-my-bash/templates/bashrc.osh-template ~/.bashrc ``` ##### 4. Reload your .bashrc ```shell source ~/.bashrc ``` ##### 5. Initialize your new bash configuration Once you open up a new terminal window, it should load sh with Oh My Bash's configuration. ### Installation Problems If you have any hiccups installing, here are a few common fixes. * You _might_ need to modify your `PATH` in `~/.bashrc` if you're not able to find some commands after switching to `oh-my-bash`. * If you installed manually or changed the install location, check the `OSH` environment variable in `~/.bashrc`. ### Customization of Plugins and Themes If you want to override any of the default behaviors, just add a new file (ending in `.sh`) in the `custom/` directory. If you have many functions that go well together, you can put them as a `XYZ.plugin.sh` file in the `custom/plugins/XYZ` directory and then enable this plugin by adding the name to the `plugins` array in `~/.bashrc`. If you would like to modify an existing module (theme/plugin/aliases/completion) bundled with Oh My Bash, first copy the original module to `custom/` directory and modify it. It will be loaded instead of the original one when it is enabled through `OSH_THEME`/`plugins`/`aliases`/`completions` in `~/.bashrc`. ```bash $ mkdir -p "$OSH_CUSTOM/themes" $ cp -r {"$OSH","$OSH_CUSTOM"}/themes/agnoster $ EDIT "$OSH_CUSTOM/themes/agnoster/agnoster.theme.sh" ``` If you would like to track the upstream changes for your customized version of modules, you can optionally directly edit the original files and commit them. In this case, you need to handle possible conflicts with the upstream (`github.com/ohmybash/oh-my-bash`) in upgrading. If you want to replace an existing module (theme/plugin/aliases/complet) bundled with Oh My Bash, create a module of the same name in the `custom/` directory so that it will be loaded instead of the original one. ### Configuration #### Enable/disable python venv The python virtualenv/condaenv information in the prompt may be enabled by the following line in `~/.bashrc`. ```bash OMB_PROMPT_SHOW_PYTHON_VENV=true ``` Some themes turn on it by default. If you would like to turn it off, you may disable it by the following line in `~/.bashrc`: ```bash OMB_PROMPT_SHOW_PYTHON_VENV=false ``` #### Enable/disable Spack environment information To enable the Spack environment information in the prompt, please set the following shell variable in `~/.bashrc`: ```bash OMB_PROMPT_SHOW_SPACK_ENV=true ``` If the theme supports it, the information of the currently active Spack environment will be shown. If the theme you use does not support the Spack environment information, a pull request to add it is welcome. See the `font` theme as an example implementation of including the Spack environment. #### Disable internal uses of `sudo` Some plugins of oh-my-bash internally use `sudo` when it is necessary. However, this might clutter with the `sudo` log. To disable the use of `sudo` by oh-my-bash, `OMB_USE_SUDO` can be set to `false` in `~/.bashrc`. ```bash OMB_USE_SUDO=false ``` Each plugin might provides finer configuration variables to control the use of `sudo` by each plugin. ## Getting Updates By default, you will be prompted to check for upgrades every few weeks. If you would like `oh-my-bash` to automatically upgrade itself without prompting you, set the following in your `~/.bashrc`: ```shell DISABLE_UPDATE_PROMPT=true ``` To disable automatic upgrades, set the following in your `~/.bashrc`: ```shell DISABLE_AUTO_UPDATE=true ``` ### Manual Updates If you'd like to upgrade at any point in time (maybe someone just released a new plugin and you don't want to wait a week?) you just need to run: ```shell upgrade_oh_my_bash ``` Magic! ## Uninstalling Oh My Bash Oh My Bash isn't for everyone. We'll miss you, but we want to make this an easy breakup. If you want to uninstall `oh-my-bash`, just run `uninstall_oh_my_bash` from the command-line. It will remove itself and revert your previous `bash` configuration. ## Contributing Check out [`CONTRIBUTING.md`](CONTRIBUTING.md) and also [Code of Conduct](CODE_OF_CONDUCT.md). This project is initially ported from Oh My Zsh and Bash-it by `@nntoan` and has been developed in a community-driven way. Most of the contributors are far from being [Bash](https://www.gnu.org/software/bash/) experts, and there are many ways to improve the codebase. We are looking for more people with expertise in Bash scripting. If you have ideas on how to make the configuration easier to maintain (and faster), don't hesitate to fork and send pull requests! We also need people to test out pull-requests. Take a look through [the open issues](https://github.com/ohmybash/oh-my-bash/issues) and help where you can. ## Contributors Oh My Bash has a vibrant community of happy users and delightful contributors. Without all the time and help from our contributors, it wouldn't be so awesome. Thank you so much! ## License See [`LICENSE.md`](License.md). Oh My Bash is derived from [Oh My Zsh](https://github.com/ohmyzsh/ohmyzsh). Oh My Bash is released under the [MIT license](LICENSE.md). --- ## File: aliases/README.md # aliases An `aliases` module define a set of aliases closely related with each other. To activate an `aliases` module, add the name of the module in the `aliases` array in your `~/.bashrc`: ```bash aliases=(... ) ``` where `` should be related by the name of the module to activate. ## List of aliases modules See the respective pages for details. - `chmod` - [`debian`](debian.aliases.md) - [`docker`](docker.aliases.md) - [`general`](general.aliases.md) - `ls` - `misc` - [`package-manager`](package-manager.aliases.md) - [`terraform`](terraform.aliases.md) - [`cargo`](cargo.aliases.md) --- ## File: plugins/rbenv/README.md # rbenv plugin The rbenv plugin will configure rbenv paths. ## List of aliases | Alias | Command | Description | |--------|------------------|--------------------------------------| | rubies | 'rbenv versions' | shows all installed versions of ruby | --- ## File: plugins/progress/README.md # Using the Progress Bar Script ## Description This script provides a simple progress bar TUI for the terminal platform. It allows you to visualize the progress of a task being executed in your shell script. ## Usage You can use the function `progress` from the interactive settings with Oh My Bash. The function handles printing of the progress bar. 1. **Enable plugin:** - Add the plugin name `progress` in the `plugins` array in `~/.bashrc`. ```shell # bashrc plugins=(... progress) ``` 2. **Invoke `progress` Function:** - Within a shell function, call the `progress` function whenever you want to display the progress bar. - Pass two parameters to the `progress` function: - `value`: The progress percentage (0-100) of the task. Passing 0 will reset the progress bar status. - `message`: Optional. A status message to display alongside the progress bar. ```bash # Example usage: progress 25 "Processing data..." # Displays a 25% progress bar with the status "Processing data..." ``` To change the delay of the progress bar, please overwrite the `delay` function. ```bash # Example: change the delay to 0.1 sec function delay { sleep 0.1; } ``` _⚠️ if you want to add only the plugin and not Oh My Bash, you can copy the file `progress.plugin.sh` to a place you like and source it in `~/.basrhc` (for interactive uses) or in a shell script (for a standalone shell program). You may instead copy and paste the functions directly into a script file, in which case the plugin will not receive updates and possible errors will have to be solved by you_ ## Example ```bash # bashrc function example { # Example: Your code for the shell function here: Invoke the progress # function to display the progress bar as your function progresses. This # displays a 25% progress bar with the status "Processing data...": progress 25 "Processing data..." ``` This will visually represent the progress of your function's execution in the terminal. Adjust the `progress` function calls according to the progress of your task. --- ## File: plugins/nvm/README.md # nvm plugin This plugin automatically source nvm[1] ## Installation ### Install nvm Lets install[2] the nvm without updaing shell config! ```bash export NVM_DIR="$HOME/.nvm" && ( git clone https://github.com/nvm-sh/nvm.git "$NVM_DIR" cd "$NVM_DIR" git checkout `git describe --abbrev=0 --tags --match "v[0-9]*" $(git rev-list --tags --max-count=1)` ) && \. "$NVM_DIR/nvm.sh" ``` ### Include nvm as plugin ```bash plugins=( git nvm ) ``` ## nvm completion configuration ```bash completions=( git composer ssh nvm ) ``` ## `.nvmrc` autoload If set, the plugin will automatically load a node version when it finds a `.nvmrc` file[3] in the current working directory indicating which node version to load. This can be done by adding the following to your `.bashrc`: ```bash OMB_PLUGIN_NVM_AUTO_USE=true ``` [1]: https://github.com/nvm-sh/nvm [2]: https://github.com/nvm-sh/nvm#manual-install [3]: https://github.com/nvm-sh/nvm#nvmrc --- ## File: plugins/npm/README.md # npm plugin The npm plugin provides completion as well as adding many useful aliases. To use it, add npm to the plugins array of your bashrc file: ```bash plugins=(... npm) ``` ## Aliases | Alias | Command | Description | |:------ |:-----------------------------|:----------------------------------------------------------------| | `npmg` | `npm i -g` | Install dependencies globally | | `npmS` | `npm i -S` | Install and save to dependencies in your package.json | | `npmD` | `npm i -D` | Install and save to dev-dependencies in your package.json | | `npmE` | `PATH="$(npm bin)":"$PATH"` | Run command from node_modules folder based on current directory | | `npmO` | `npm outdated` | Check which npm modules are outdated | | `npmV` | `npm -v` | Check package versions | | `npmL` | `npm list` | List installed packages | | `npmL0` | `npm ls --depth=0` | List top-level installed packages | | `npmst` | `npm start` | Run npm start | | `npmt` | `npm test` | Run npm test | | `npmR` | `npm run` | Run npm scripts | | `npmP` | `npm publish` | Run npm publish | | `npmI` | `npm init` | Run npm init | --- ## File: plugins/kubectl/README.md # Kubectl plugin This plugin adds completion for the [Kubernetes cluster manager](https://kubernetes.io/docs/reference/kubectl/kubectl/), as well as some aliases for common kubectl commands. To use it, add `kubectl` to the plugins array in your bashrc file: ```bash plugins=(... kubectl) ``` ## Aliases | Alias | Command | Description | |:--------|:------------------------------------|:-------------------------------------------------------------------------------------------------| | k | `kubectl` | The kubectl command | | kca | `kubectl --all-namespaces` | The kubectl command targeting all namespaces | | kaf | `kubectl apply -f` | Apply a YML file | | keti | `kubectl exec -ti` | Drop into an interactive terminal on a container | | | | **Manage configuration quickly to switch contexts between local, dev and staging** | | kcuc | `kubectl config use-context` | Set the current-context in a kubeconfig file | | kcsc | `kubectl config set-context` | Set a context entry in kubeconfig | | kcdc | `kubectl config delete-context` | Delete the specified context from the kubeconfig | | kccc | `kubectl config current-context` | Display the current-context | | kcgc | `kubectl config get-contexts` | List of contexts available | | | **General aliases** | | kdel | `kubectl delete` | Delete resources by filenames, stdin, resources and names, or by resources and label selector | | kdelf | `kubectl delete -f` | Delete a pod using the type and name specified in -f argument | | | | **Pod management** | | kgp | `kubectl get pods` | List all pods in ps output format | | kgpw | `kgp --watch` | After listing/getting the requested object, watch for changes | | kgpwide | `kgp -o wide` | Output in plain-text format with any additional information. For pods, the node name is included | | kep | `kubectl edit pods` | Edit pods from the default editor | | kdp | `kubectl describe pods` | Describe all pods | | kdelp | `kubectl delete pods` | Delete all pods matching passed arguments | | kgpl | `kgp -l` | Get pod by label. Example: `kgpl "app=myapp" -n myns` | | | | **Service management** | | kgs | `kubectl get svc` | List all services in ps output format | | kgsw | `kgs --watch` | After listing all services, watch for changes | | kgswide | `kgs -o wide` | After listing all services, output in plain-text format with any additional information | | kes | `kubectl edit svc` | Edit services(svc) from the default editor | | kds | `kubectl describe svc` | Describe all services in detail | | kdels | `kubectl delete svc` | Delete all services matching passed argument | | | | **Ingress management** | | kgi | `kubectl get ingress` | List ingress resources in ps output format | | kei | `kubectl edit ingress` | Edit ingress resource from the default editor | | kdi | `kubectl describe ingress` | Describe ingress resource in detail | | kdeli | `kubectl delete ingress` | Delete ingress resources matching passed argument | | | | **Namespace management** | | kgns | `kubectl get namespaces` | List the current namespaces in a cluster | | kcn | `kubectl config set-context ...` | Change current namespace | | kens | `kubectl edit namespace` | Edit namespace resource from the default editor | | kdns | `kubectl describe namespace` | Describe namespace resource in detail | | kdelns | `kubectl delete namespace` | Delete the namespace. WARNING! This deletes everything in the namespace | | | | **ConfigMap management** | | kgcm | `kubectl get configmaps` | List the configmaps in ps output format | | kecm | `kubectl edit configmap` | Edit configmap resource from the default editor | | kdcm | `kubectl describe configmap` | Describe configmap resource in detail | | kdelcm | `kubectl delete configmap` | Delete the configmap | | | | **Secret management** | | kgsec | `kubectl get secret` | Get secret for decoding | | kdsec | `kubectl describe secret` | Describe secret resource in detail | | kdelsec | `kubectl delete secret` | Delete the secret | | | | **Deployment management** | | kgd | `kubectl get deployment` | Get the deployment | | kgdw | `kgd --watch` | After getting the deployment, watch for changes | | kgdwide | `kgd -o wide` | After getting the deployment, output in plain-text format with any additional information | | ked | `kubectl edit deployment` | Edit deployment resource from the default editor | | kdd | `kubectl describe deployment` | Describe deployment resource in detail | | kdeld | `kubectl delete deployment` | Delete the deployment | | ksd | `kubectl scale deployment` | Scale a deployment | | krsd | `kubectl rollout status deployment` | Check the rollout status of a deployment | | kres | `kubectl set env $@ REFRESHED_AT=...` | Recreate all pods in deployment with zero-downtime | | | | **Rollout management** | | kgrs | `kubectl get rs` | To see the ReplicaSet `rs` created by the deployment | | krh | `kubectl rollout history` | Check the revisions of this deployment | | kru | `kubectl rollout undo` | Rollback to the previous revision | | | | **Port forwarding** | | kpf | `kubectl port-forward` | Forward one or more local ports to a pod | | | | **Tools for accessing all information** | | kga | `kubectl get all` | List all resources in ps format | | kgaa | `kubectl get all --all-namespaces` | List the requested object(s) across all namespaces | | | | **Logs** | | kl | `kubectl logs` | Print the logs for a container or resource | | klf | `kubectl logs -f` | Stream the logs for a container or resource (follow) | | | | **File copy** | | kcp | `kubectl cp` | Copy files and directories to and from containers | | | | **Node management** | | kgno | `kubectl get nodes` | List the nodes in ps output format | | keno | `kubectl edit node` | Edit nodes resource from the default editor | | kdno | `kubectl describe node` | Describe node resource in detail | | kdelno | `kubectl delete node` | Delete the node | | | | **Persistent Volume Claim management** | | kgpvc | `kubectl get pvc` | List all PVCs | | kgpvcw | `kgpvc --watch` | After listing/getting the requested object, watch for changes | | kepvc | `kubectl edit pvc` | Edit pvcs from the default editor | | kdpvc | `kubectl describe pvc` | Descirbe all pvcs | | kdelpvc | `kubectl delete pvc` | Delete all pvcs matching passed arguments | | | | | | kgss | `kubectl get statefulset` | List the statefulsets in ps format | | kgssw | `kgss --watch` | After getting the list of statefulsets, watch for changes | | kgsswide| `kgss -o wide` | After getting the statefulsets, output in plain-text format with any additional information | | kess | `kubectl edit statefulset` | Edit statefulset resource from the default editor | | kdss | `kubectl describe statefulset` | Describe statefulset resource in detail | | kdelss | `kubectl delete statefulset` | Delete the statefulset | | ksss | `kubectl scale statefulset` | Scale a statefulset | | krsss | `kubectl rollout status statefulset`| Check the rollout status of a deployment | --- ## File: plugins/jump/README.md # jump plugin The jump plugin enables jump on bash. Jump integrates with your shell and learns about your navigational habits by keeping track of the directories you visit. It gives you the most visited directory for the shortest search term you type. ## Installation 1. [Install jump](https://github.com/gsamokovarov/jump?tab=readme-ov-file#installation) 2. Enable the plugin by adding it to the plugins array of your bashrc file: ```bash plugins=(... jump) ``` 3. (Optional) Enable the completions by adding it to the completions array of bashrc file: ```bash completions=(... jump) ``` ## Usage See the [jump usage documentation](https://github.com/gsamokovarov/jump?tab=readme-ov-file#usage) for information on how to use jump. --- ## File: plugins/golang/README.md # Golang plugin The `golang plugin` plugin adds some aliases for common [Golang](https://golang.org/) commands. To use it, add `golang` to the plugins array of your bashrc file: ``` plugins=(... golang) ``` ## Aliases | Alias | Command | Description | | ------- | ----------------------- | ------------------------------------------------------------- | | gob | `go build` | Build your code | | goc | `go clean` | Removes object files from package source directories | | god | `go doc` | Prints documentation comments | | gof | `go fmt` | Gofmt formats (aligns and indents) Go programs. | | gofa | `go fmt ./...` | Run go fmt for all packages in current directory, recursively | | gog | `go get` | Downloads packages and then installs them to $GOPATH | | goi | `go install` | Compiles and installs packages to $GOPATH | | gol | `go list` | Lists Go packages | | gom | `go mod` | Access to operations on modules | | gop | `cd $GOPATH` | Takes you to $GOPATH | | gopb | `cd $GOPATH/bin` | Takes you to $GOPATH/bin | | gops | `cd $GOPATH/src` | Takes you to $GOPATH/src | | gor | `go run` | Compiles and runs your code | | got | `go test` | Runs tests | | gov | `go vet` | Vet examines Go source code and reports suspicious constructs |