Streamlining .deb Package Installation on Ubuntu: A Better Way to Manage Downloaded Packages
As an Ubuntu user, I frequently find myself downloading and installing .deb packages from various sources. While Ubuntu's Software Center and apt
handle most package installations, there are times when you need to install software directly from .deb files. The standard approach using dpkg -i
works, but it could be more user-friendly. Here's how I've streamlined this process with a simple yet powerful bash script.
The Problem with Traditional .deb Installation
The traditional way to install a .deb package involves:
Opening a terminal
Navigating to the download directory
Running
sudo dpkg -i package.deb
Manually cleaning up the .deb file afterward
This process lacks safeguards, confirmation prompts, and automatic cleanup. It's not terrible, but it could be better.
The Solution: A Smart Installation Script
I've created a bash script that makes this process more intuitive and safer. Here are its key features:
1. User-Friendly Confirmation
Instead of immediately executing with sudo privileges, the script asks for confirmation first. This prevents accidental installations and provides a moment to double-check.
2. Smart Cleanup
After successful installation, the script asks if you want to delete the .deb file. This helps keep your downloads folder clean without forcing automatic deletion.
3. Non-Interactive Mode
For automation scenarios, the script includes a -y
flag that skips the installation confirmation prompt.
Using the Script
Basic Usage
install firefox.deb
This will:
Ask for confirmation before installation
Install the package with sudo privileges
Ask if you want to delete the installer file
Non-Interactive Usage
install -y firefox.deb
This will:
Install immediately (no confirmation)
Still ask about file cleanup
The Script Explained
The core of the script is quite straightforward:
install () {
if [ $# -eq 0 ]; then
echo "No package file specified."
return 1
fi
local package_file="$1"
local skip_prompt=false
if [[ "$1" == "-y" ]]; then
shift
package_file="$1"
skip_prompt=true
fi
if $skip_prompt; then
sudo dpkg -i "$package_file"
install_status=$?
else
echo "Are you sure you want to install $package_file (requires sudo)?"
read -p "Enter (y)es, (n)o, or (Y)es to skip this prompt in the future: " answer
case $answer in
[yY] )
sudo dpkg -i "$package_file"
install_status=$?
;;
n|N )
echo "Installation cancelled."
return 1
;;
* )
echo "Invalid input. Please enter y, n, or Y."
return 1
;;
esac
fi
if [ $install_status -eq 0 ]; then
echo "Installation completed successfully."
read -p "Do you want to delete the package file $package_file? (y/n): " delete_answer
case $delete_answer in
[yY] )
rm "$package_file"
echo "Package file deleted."
;;
* )
echo "Package file retained."
;;
esac
fi
}
Key components:
Input validation ensures a package file is specified.
Confirmation prompt offers yes/no options to install and
yes-always
to skip confirmation in future.Success checking verifies installation before offering file cleanup.
File deletion prompts to help keep the folder tidy.
Bonus: Package Removal
The script also includes a remove
function for uninstalling packages:
remove () {
if [ $# -eq 0 ]; then
echo "No package name specified."
return 1
fi
local search_name="$1"
local skip_prompt=false
if [[ "$1" == "-y" ]]; then
shift
search_name="$1"
skip_prompt=true
fi
local packages
packages=$(dpkg -l | grep "$search_name" | awk '{print $2}')
if [ -z "$packages" ]; then
echo "No installed packages found matching '$search_name'."
return 1
fi
echo "Packages found:"
select package in $packages; do
if [ -n "$package" ]; then
break
else
echo "Invalid selection. Please select a valid package number."
fi
done
if $skip_prompt; then
sudo dpkg -r "$package"
remove_status=$?
else
echo "Are you sure you want to remove $package (requires sudo)?"
read -p "Enter (y)es, (n)o, or (Y)es to skip this prompt in the future: " answer
case $answer in
[yY] )
sudo dpkg -r "$package"
remove_status=$?
;;
n|N )
echo "Removal cancelled."
return 1
;;
* )
echo "Invalid input. Please enter y, n, or Y."
return 1
;;
esac
fi
if [ $remove_status -eq 0 ]; then
echo "Package '$package' removed successfully."
read -p "Do you want to remove configuration files for $package as well? (y/n): " config_answer
case $config_answer in
[yY] )
sudo dpkg -P "$package"
echo "Configuration files removed."
;;
* )
echo "Configuration files retained."
;;
esac
else
echo "Failed to remove package '$package'."
return 1
fi
}
Setting Up the Script
Open your
.bashrc
file:nano ~/.bashrc
Add the script functions to the end of the file.
Save and reload your terminal:
source ~/.bashrc
Benefits Over Traditional Methods
Safety: Confirmation prompts prevent accidental installations.
Cleanliness: Optional cleanup of installer files.
Flexibility: Support for both interactive and non-interactive usage.
Consistency: Unified interface for both installation and removal.
Real-World Usage Examples
I frequently use this when installing:
Third-party applications not in the Ubuntu repositories.
Specific versions of software not available via
apt
.Custom packages from development teams.
Conclusion
This script has significantly improved my workflow when dealing with .deb packages. It adds safety features and automation while remaining simple and easy to use. Feel free to adapt it to your needs or suggest improvements!
Pro Tips
Keep the script in your
.bashrc
for easy access.Consider adding an alias if you prefer a different command name.
Use the
-y
flag in your automation scripts.
Note: This script assumes you're using Ubuntu or a Debian-based system with dpkg
available.
FYI: Most of this article was made/modified by an LLM; Why!? Cause it’s 2024, and we all have better things to do with our time!
Subscribe to my newsletter
Read articles from Michael Amachree directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by