DEV Community

TekWizely
TekWizely

Posted on

4 2

ShowDEV: My-Alternatives - Hacking update-alternatives to make user-level changes

Introducing My-Alternatives

My-Alternatives takes an honest run at making a useful tool to allow you to configure alternatives (see: update-alternatives) that only affect your local account / shell sessions.

No root/sudo

My-Alternatives does not require root / sudo privileges to use, as it creates and maintains user-owned alt root directories that store your alternative links.

Quick Example

Here's a quick example of using my-alterantives to configure a local override for the pager alternative:

confirm current system value for pager

$ which pager

/usr/bin/pager
Enter fullscreen mode Exit fullscreen mode

take a closer look

$ ls -l /usr/bin/pager

lrwxrwxrwx root root  /usr/bin/pager -> /etc/alternatives/pager

$ ls -l /etc/alternatives/pager

lrwxrwxrwx  root  root  /etc/alternatives/pager -> /usr/bin/less
Enter fullscreen mode Exit fullscreen mode

init my-alternatives

$ eval "$( my-alternatives init )"
Enter fullscreen mode Exit fullscreen mode

configure pager

$ my-alternatives config pager

There are 2 choices for the alternative pager (providing ${MY_ALTS_ROOT}/bin/pager).

  Selection    Path            Priority   Status
------------------------------------------------------------
  1            /bin/more        50        
  2            /usr/bin/less    77        system value

Type selection number: 
Enter fullscreen mode Exit fullscreen mode

select non-system value '/bin/more'

... Type selection number: 1

configured local alternative for pager: /bin/more
Enter fullscreen mode Exit fullscreen mode

confirm updated value

$ which pager

/tmp/my-alts.abcd/bin/pager
Enter fullscreen mode Exit fullscreen mode

take a closer look

$ ls -l "${MY_ALTS_ROOT}"/bin/pager "${MY_ALTS_ROOT}"/man/man1/pager.1.gz

lrwxrwxrwx  user  group  bin/pager -> /bin/more
lrwxrwxrwx  user  group  man/man1/pager.1.gz -> /usr/share/man/man1/more.1.gz
Enter fullscreen mode Exit fullscreen mode

Per-Shell Alternatives

The example above shows how to create per-shell alternatives.

That is, using my-alternatives init without specifying a target directory results in the creation and use of a temporary directory that only the current shell session knows about.

User-Level Alternatives

You can configure user-level alternatives by providing a specific init directory i.e:

$ eval "$( my-alternatives init ~/.my-alts )"
Enter fullscreen mode Exit fullscreen mode

More Information

Please see the Project Homepage for more inrmation.

Thanks for looking and please let me know if you have any questions!

-TekWizely

Image of Datadog

The Essential Toolkit for Front-end Developers

Take a user-centric approach to front-end monitoring that evolves alongside increasingly complex frameworks and single-page applications.

Get The Kit

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay