For one user account, I want to have some bash scripts, which of course would be under version control.

The obvious solution is just to put the scripts in a git repository and make ~/bin a symlink to the scripts directory.

Now, it seems on systemd systems ~/.local/bin is supposedly the directory for user scripts.

My question, is mostly, what are the tradeoffs between using ~/bin and ~/.local/bin as directory for my own bash scripts?

One simple scenario I can come up with are 3rd party programs which might modify ~/.local/bin and put their own scripts/starters there, similar to 3rd party applications which put their *.desktop files in ~/.local/applications.

Any advice on this? Is ~/.local/bin safe to use for my scripts or should I stick to the classic ~/bin? Anyone has a better convention?

(Btw.: I am running Debian everywhere, so I do not worry about portability to non systemd Linux systems.)

Solved: Thanks a lot for all the feedback and answering my questions! I’ll settle with having my bash scripts somewhere under ~/my_git_monorepo and linking them to ~/.local/bin to stick to the XDG standard.

  • Sinthesis
    link
    fedilink
    English
    arrow-up
    6
    ·
    edit-2
    12 hours ago

    Neither ~/bin or ~/.local/bin are part of most shell’s default $PATH so you’re going to have to modify the user’s shell profile (or rc) to include it. It’s possible that your favorite distro includes it but not mine. For example(s):

    unset PATH                                             
    
    ﬌ /bin/bash --noprofile --norc         
    bash-5.2$ echo $PATH
    /usr/local/bin:/usr/bin
    

    or

    unset PATH
    
    ﬌ /bin/zsh --no-rcs --no-global-rcs
    Sinthesis% echo $PATH
    /bin:/usr/bin:/usr/ucb:/usr/local/bin
    
    ﬌ ls -l /bin
    lrwxrwxrwx. 1 root root 7 Jan 23  2024 /bin -> usr/bin
    

    That was on Fedora. The funny thing is /bin is soft linked to usr/bin, weeeee.

    This is on Debian

    Sinthesis@debian:~$ /bin/bash --noprofile --norc
    bash-5.2$ echo $PATH
    /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
    

    I’m not sure why you’re bringing the XDG or systemd “standard” into this. POSIX standard would be more appropriate but they don’t say anything on the matter, nor should they really. The most important thing is, be predictable. If the user has a problem with one of your scripts, what do they do first? which wolf_bin will show them the full path to the script. So really, the location does not matter much.

    That said I would go with one of these two options:

    1. Make a package for your distro. This may be overkill for a couple scripts but you did say they’re in a git repository so you could automate it. The package would install to /usr/bin which would require sudo or root. If the scripts are only allowed to be run by one user, set the rwx and group permissions.

    2. A pattern I like, especially for lightweight things such as scripts that don’t require compiling or OS management and also are using git; a “hidden” or “dot” directory in the user’s home where the repo lives e.g. ~/.lemmywolf/ Then add scripts directory to the user’s $PATH e.g. PATH=$PATH:~/.lemmywolf/scripts. This is what some fairly large projects like pyenv or volta do. You could take it a step farther and modify this installer script to your liking https://github.com/pyenv/pyenv-installer/blob/master/bin/pyenv-installer

    /edit 20 year Linux user (Redhat AS2.1) and 5 years of Unix (HPUX & Solaris) before that.

    /edit2 I just noticed the pyenv-installer does not modify the user’s shell profile. That could easily be added to the script though.

    • Ferk@lemmy.ml
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      2 hours ago

      I’m not sure why you’re bringing the XDG or systemd “standard” into this.

      Probably because in their “basedir” specification they do recommend ~/.local/bin to be in $PATH. I’m sure there’s more than one distro following that spec, whether we’d want to consider it standard or not. I also believe there’s some software (like flatpak) that may place scripts there too, when configured to offer commands for user-level instalations.

      Here’s a quote from the spec:

      User-specific executable files may be stored in $HOME/.local/bin. Distributions should ensure this directory shows up in the UNIX $PATH environment variable, at an appropriate place.