Readit News logoReadit News
pwagland · a year ago
The other advantage that the article misses for aliases is that completions will work through aliases. So, in the case give for `alias g=git` typing `g <tab>` will give you the bash/zsh completions for git. You _can_ do this for the script as well, but then you need to code that up separately.
watusername · a year ago
Yes, and this is why I recommend against the alias-y wrappers.

Personally, I like using abbreviations ("abbr") in fish, which automatically expand as you hit space. This is especially helpful when screen sharing: No more "what does this gcob command do" questions!

leojfc · a year ago
Yeah, I do something kind of similar, using Dash [1] snippets which expand to full commands.

Since I'm almost always on my mac, it means they're available in every shell, including remote shells, and in other situations like on Slack or writing documentation.

I mostly use § as a prefix so I don't type them accidentally (although my git shortcuts are all `gg`-consonant which is not likely to appear in real typing).

[1] https://kapeli.com/dash

BerislavLopac · a year ago
I was nearly 10 years old (i.e. as a Fish user) when I learned about abbr. I used to use functions for everything. :facepalm:
psychoslave · a year ago
Came here to mention just this, all the more as the article mention that the author is considering a move to Fish.
lvncelot · a year ago
Another advantage of using alias: `which [alias]` actually tells you what that alias is mapped to, and not just the location of a script in your bin folder.
Graziano_M · a year ago
On what shell? That doesn't work in bash. I use `type` for that, since it'll tell you if it's on PATH, a function, or an alias

which gdb /opt/homebrew/bin/gdb

~ type gdb gdb is aliased to `gdb -q'

darrenf · a year ago
This is something I've never seen. `which` (at least on the hosts I currently have access to) is its own binary `/usr/bin/which` and unrelated to the shell and its aliases or abbreviations.

`type` is a builtin on both fish and bash though, and does resolve aliases.

[edit] TIL: `zsh` has its own `which`.

srveale · a year ago
`alias | grep [alias name]` works as well, for me at least
saghm · a year ago
I remember years ago seeing a trick related to this to allow aliases after `sudo` (which I think by default won't recognize them due to running as a separate user) by doing `alias sudo="sudo ".
modeless · a year ago
This doesn't work for me in Ubuntu 22.04. Is it a recent feature of bash?
mqus · a year ago
This is a feature in zsh (I don't think it works in bash and the autocomplete in bash is also a bit inferior to the zsh one)
tasn · a year ago
I came here to say the same thing. I'm also not convinced about the instant reload aspect. You can always just define your aliases in a different file and source it when updating aliases (how often does that happen anyway?), source your .zshrc, or just open a new terminal window.
chrisfinazzo · a year ago
Sourcing .zshrc works reasonably well. I have the following at the end of setup.sh -- which creates symlinks and sets up other configurations.

makeLinks does most of the work, then sets Homebrew's zsh as the default shell -- this currently runs in bash, so it probably will need to be updated at some point -- and everything gets reloaded.

    makeLinks && chsh -s /usr/local/bin/zsh
  
    exec $SHELL && brew doctor

alkh · a year ago
I have an alias reload="exec zsh" for fast reloading. Admittedly, this does wreck up everything set up locally but I doubt you will be modifying ~/.[zsh|bash]rc file often
chime · a year ago
I have alias s='source ~/.zshrc'.
shellnoob · a year ago
nobody tell him
JadeNB · a year ago
> nobody tell him

What?

ale42 · a year ago
I'm not sure I understand this point:

  > I use Bash for a lot of my scripts, but not all. For example
  > I have a note-taking script called ~/bin/note which I didn’t
  > want to write in Bash, so I wrote it in Python instead. With
  > an alias, I’d have to write it in Zsh.
If the script is an actual script that does something more than just calling another program, then the comparison to an alias doesn't make sense. And if it's about setting up an alias to a Python program, it can definitely be done. Is there anything I'm missing here?

eqvinox · a year ago
There isn't a well-defined / binary boundary to an "actual script"; I'm assuming this "note" thing is something like a 10-liner in Python. It's simply two curves of scripting in sh/bash/zsh becoming more difficult vs. Python starting with more effort but a more shallow curve — at some point the curves cross. But that crossover point is different for each person, and the other option doesn't immediately become impossible.

Deleted Comment

latexr · a year ago
> When I create, update, or delete an alias, I have to reload my `.zshrc`.

Only if you need the change to be available immediately in the tab you’re on. Which you can ensure, appropriately, with an alias:

  alias z='"${EDITOR}" ~/.zshrc && source ~/.zshrc'
Now executing `z` will open your `.zshrc` in your default editor and immediately source it afterwards.

dcb_lu · a year ago
I do something similar to my .bash_aliases, but with a few short additions to make sure running it multiple times doesn't have any strange side effects. For instance:

  function edit_load() {
    $EDITOR $1
    source $1
    if [ $? -eq 0 ]
    then
      echo "$1 updated."
    fi
  }
  alias aliases="edit_load ~/.bash_aliases"

  # to make sure I don't add things to $PATH on each reload
  append_path () {
    case ":$PATH:" in
      *:"$1":*)
        ;;
      \*)
        PATH="${PATH:+$PATH:}$1"
    esac
  }
  append_path '/blah/blah/bin'

noahjk · a year ago
Here's what I use in my .zshrc with VS Code:

    alias reload="source ~/.zshrc >/dev/null"
    alias zshconfig="code --wait --new-window ~/.zshrc && reload"
the --wait flag tells zsh that it's not done executing until the window/file is closed.

latexr · a year ago
On macOS, you can do that for any GUI editor by using the `open` command with the `-W` and `-n` flags. See `man open` for details.
thor_molecules · a year ago
I reach for the ~/bin/thing approach when I want the utility to be useable from vim.

For example, if I define an alias thing, vim won't know about it.

But as a executable on my $PATH, I can do any of the following:

  :%!thing
  :'<'>!thing
  :.!thing
A good example is on my work machine, I can't install jq because reasons. However I do have python, so I have a simple executable called fmtjson that looks like this:

  #!/bin/sh
  python -m json.tool --indent 2
When I want to format some json from vim, I just run:

  :%!fmtjson
Easy to remember, easy to type. Plus I can use it in pipes on the cli.

tester457 · a year ago
For more power try fish's abbreviations.

With `--position anywhere` you can expand an abbreviation even if it's not at the beginning of a line.

dmd · a year ago
Another great advantage of fish abbreviations is your history shows the actual command that was run (and in fact as soon as you've typed it, it expands, so you SEE what you're running).
jacobsenscott · a year ago
Yes, essentially on the fly editable aliases. Fish is so good. I assume there's a zsh plugin that mimics that functionality - zsh people should try it.
mattgreenrocks · a year ago
I like putting my "aliases" into the functions directory of my config.

I have one that uses podman if it's available when I type `docker`. If I ever specifically need Docker I can use the fully-qualified path. I have a similar trick for `nvim`/`vim`.

watusername · a year ago
This is the right way. I mentioned in another comment, but abbreviations also shine when screen sharing: Everyone can follow along quickly without having to ask the "what does this gcob command do" questions.
sisk · a year ago
zsh also supports the "alias anywhere" concept (their term is "global alias") by using the `-g` flag.

   alias -g ag='2>&1 | grep'
   some-command ag 'words' # equivalent to: some-command 2>&1 | grep 'words'

alkh · a year ago
Yeah, it's very convenient. Here are a few of mine(tested on OS X):

  alias -g L="| less"
  alias -g T="| tee"
  alias -g C="| pbcopy"
  alias -g @all="> /dev/null 2>&1"
  if command -v rg > /dev/null; then
   alias -g G="| rg"
  else
   alias -g G="| grep"
  fi

gthink · a year ago
It seems like a lot of effort to replace just `alias g=git?` Not to mention the fact that you have to move the script files across systems as well.

I think the target is mostly cross-shell porting here.

andoveragain · a year ago
Sounds like overengineering. If you just need a shortcut for a command, that's exactly what aliases are for. If you need something more sophisticated, you probably are going to lean to scripts or functions.
eqvinox · a year ago
Pretty much agree with most. I am wondering about paths and locations; there's now ~/.local/bin which is where e.g. a user-wide "pip install" would put things [when used without a venv]… ~/bin is not such a "standardized" location. I kinda started using both and am a bit torn now…