this post was submitted on 23 Jul 2024
29 points (100.0% liked)

Linux

1257 readers
27 users here now

From Wikipedia, the free encyclopedia

Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).

Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.

Rules

Related Communities

Community icon by Alpár-Etele Méder, licensed under CC BY 3.0

founded 5 years ago
MODERATORS
 

My question is whether it is good practice to include a unique wrapper phrase for custom commands and aliases.

For example, lets say I use the following command frequently:

apt update && apt upgrade -y && flatpak update

I want to save time by shortening this command. I want to alias it to the following command:

update

And lets say I also make up a command that calls a bash script to scrub all of of my zfs and btrfs pools:

scrub

Lets say I add 100 other aliases. Maybe I am overthinking it, but I feel there should be some easy way to distinguish these from native Unix commands. I feel there should be some abstraction layer.

My question is whether converting these commands into arguments behind a wrapper command is worth it.

For example, lets say my initials are "RK". The above commands would become:

rk update rk scrub

Then I could even create the following to list all of my subcommands and their uses:

rk --help

I would have no custom commands that exist outside of rk, so I add to total of one executable to my system.

I feel like this is the "cleaner" approach, but what do you think? Is this an antipattern? Is is just extra work?

top 7 comments
sorted by: hot top controversial new old
[–] bionicjoey@lemmy.ca 19 points 3 months ago* (last edited 3 months ago)

Personally I had to come to terms with the idea that anything other than just running the raw commands will get me into trouble. I work on a lot of servers, and so I need to be able to rely on my shell knowledge even when my bashrc isn't handy. So for me it became more about just remembering what software does what thing broadly, and then checking man for the finer details.

But for a single personal machine, script it however you want. Just be aware that you'll start to build muscle memory for aliases and custom functions that won't follow you to new machines.

[–] z3rOR0ne@lemmy.ml 8 points 3 months ago* (last edited 3 months ago)

I have about 25 or so shell scripts I use somewhat regularly and well over 300 aliases. I actually specifically don't wrap package manager related scripts for no reason in particular, but many often do.

My rule for an alias is if the amount of custom flags gets lengthy, and I use it often, yeah it gets an alias. Here's an example of using yt-dlp:

alias ytdl='yt-dlp --sponsorblock-remove all --write-auto-sub -f "bestvideo\*+bestaudio[ext=m4a]/best" -f mp4'

For shell scripts, my rule goes that it should probably have multiple features related around a single idea, that way you can use getopts to create custom flags. For example, I have a script that wraps very basic, but commonly used, git commands, chaining the classic add, commit -m, and push behind a series of read prompts, it has -h flags for help -l for a minimal log output, -i to initialize a new repository (even using github api token to remotely create the repo if you want to use github), and -r to revert back changes to a specified commit.

Generally speaking aliases will get you what you need most of the time in a pinch, but shell scripting is more powerful, versatile, but potentially more time consuming.

Others have rightly pointed out that these abstractions can sometimes negatively impact muscle memory, but IMHO this only really applies if you work as devops or sysadmin, where you are often responsible for running many different Linux servers, but usually this isn't an issue if you have access to the internet and can see your saved aliases and/or scripts (but yeah, instant recall of native commands trumps notes every time).

Additionally, another mentioned using git to keep track of your aliases, which I totally agree with. Whatever you do, back up your aliases and shell scripts, ideally with a git repo of some kind. This not only allows you to take your new scripts/aliases with you wherever you go, but also reference them later in case it's not possible to use them on not your machine.

Hope this helps. Bash can be crazy powerful if you take the time to learn it, and aliases are a great entry point to recognizing that potential. Here's one of my favorites that combines mkdir with cd:

alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<' 

Good luck, and have fun.

[–] thingsiplay 5 points 3 months ago

Disadvantages are, that you probably won't learn the actual command and forget how to do it manually when needed. And that the Bash history will log the name of the alias instead full command.

I definitely think its a good idea to have a simple command running multiple commands, down to single letter changes as in alias vim='nvim' . Updating the system in particular needs an alias to me, because I combine much more with it (yay, flatpak, rustup) and at the end let balooctl6 check for new files to index:

alias update='eos-update --yay \
    && flatpak uninstall --unused \
    && flatpak update \
    && rustup update \
    && balooctl6 check'

In general, I setup a shortcut to expand aliases to their target with CTRL+Space. That means if I type update and hit CTRL+Space, then it will be expanded to the entire list of what it would execute. This allows me to check what the command does and change something before execution. Also the history will log the long format this way, instead the name of the alias. I believe its this line in my .bashrc:

# Expand alias with key binding "Control+Space".
bind '"\C- ":alias-expand-line'

Sometimes I also use functions. Functions can't be expanded. A distinguishing factor between Functions or Aliases set directly in your Bash is, that they have access to all variables and states in the .bashrc. A dedicated script would be much better isolated from your .bashrc file.

[–] hallettj@leminal.space 3 points 3 months ago

Seems like a matter of preference, and I see the logic in it. I'll mention that Nushell makes it easy to create custom shell functions that are invoked as sub-commands in this manner. https://www.nushell.sh/book/custom_commands.html#command-names

[–] LainTrain@lemmy.dbzer0.com 3 points 3 months ago

Good idea I'd say.

[–] thingsiplay 2 points 3 months ago* (last edited 3 months ago)

What I forgot in my previous comment: I have bunch of *rc aliases to open a specific config file with my neovim. It does not matter how the configuration file is named, with an extension, with rc in name, in what directory, it always follows the pattern singlecharacter+rc. Here some examples:

alias brc='nvim ~/.bashrc && source ~/.bashrc'
alias nrc='nvim ~/.config/nvim'

As you see, it can even be a directory and not a file in case of nvim config. It would then show a filemanager on that directory with many config files.

Edit: Another thing I forgot (man I'm getting old) is that you can add a backslash at the front of a command, to run the actual command and not an alias. A common example is to have alias='grep --color=auto' and alias='ls --color=auto' . If this gets in your way, just run the command as \grep or \ls to run the original command instead.

[–] carnha@lemm.ee 1 points 3 months ago

You may like this pattern of starting all custom commands with a comma - benefits against a wrapper command would be shorter command names and built-in tab completion.