Advanced Bash Scripting
Special Shell Variables
Underscore
The special shell variable $_ holds the last argument of the previous command. It’s especially handy in interactive Bash sessions and scripts when you want to avoid retyping long or dynamic arguments.
Why Use $_?
- Boosts productivity by reducing repetitive typing
- Seamlessly reuses file names, directory paths, or any last argument
- Works in interactive shells and within scripts
Note
$_ refers strictly to the last argument of the previous command. If that command had no arguments, $_ will be empty.
Interactive Shell Examples
Listing and Copying a File
$ ls -l file.conf
total 16
-rw-r--r-- 1 root root 896 Jun 18 2020 file.conf
$ cp $_ /tmp
Here, $_ expands to file.conf, so you don’t have to type it twice.
Chaining Commands
$ ls -l file.conf; echo "Done"
total 16
-rw-r--r-- 1 root root 896 Jan 18 2020 file.conf
Done
$ echo $_
Done
Since the last command was echo "Done", $_ now contains Done.
Using $_ in Scripts
#!/usr/bin/env bash
# Create a new directory
mkdir project_build
# Change into the new directory using $_
cd $_
# Show current path
pwd
Here, $_ saves you from typing project_build again.
Common Use Cases
| Scenario | Last Command | $_ Value |
|---|---|---|
| Copying a file | cp large_archive.tar.gz /backup | /backup |
| Editing a file | vim /etc/nginx/nginx.conf | /etc/nginx/nginx.conf |
| Moving a directory | mv logs_old logs_archive | logs_archive |
| Pipelining commands | grep ERROR logfile.log | logfile.log |
Advanced Examples
# Remove a file, then verify its removal
rm temp_data.csv
echo "Removed" $_
# Using in a pipeline
find . -name '*.log' | xargs gzip
echo "Compressed" $_
Further Reading
Warning
If you chain multiple commands with ; or &&, $_ always reflects the very last argument of the last executed command.
Watch Video
Watch video content