Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Which characters are allowed in a bash alias [closed]

Tags:

linux

bash

macos

I recently added

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'

to my bash_aliases file. Playing around with this, I noticed that while aliasing .. was allowed, aliasing . was not. What other punctuation characters are allowed in bash aliases?

like image 935
Boris Avatar asked Jul 11 '14 05:07

Boris


2 Answers

It's always been safer to use functions instead:

function .. { cd '..'; }
function ... { cd '../..'; }
function .... { cd '../../..'; }

Or for a conservative preference:

..() { cd '..'; }
...() { cd '../..'; }
....() { cd '../../..'; }

What is safer about doing it this way?

Aliases affect first-class syntax (if, case, etc.) and its commands are specified using quotes. It's like having to use eval unnecessarily. Using functions on the other is straightforward and you know exactly how the arguments are expanded. TL;DR aliases are a hack. It's like using a #define statement in C when you can simply define a function. It's something beginners would love to compose.

If anyone would want to define default arguments to a command, you can use command to make the function call the external command to avoid recursion. That's the right way to do it. E.g. function grep { command grep --color=auto "$@"; }

like image 94
konsolebox Avatar answered Sep 19 '22 15:09

konsolebox


Bash aliases definitely cannot contain these characters: space , tab \t, newline \n, /, $, `, =, |, &, ;, (, ), <, >, ' and ".

The GNU manual for bash https://www.gnu.org/software/bash/manual/html_node/Aliases.html says:

The characters /, $, `, = and any of the shell metacharacters or quoting characters listed above may not appear in an alias name.

"shell metacharacters" are defined in https://www.gnu.org/software/bash/manual/html_node/Definitions.html as

A character that, when unquoted, separates words. A metacharacter is a space, tab, newline, or one of the following characters: |, &, ;, (, ), <, or >.

I couldn't find a list of "quoting characters" https://www.gnu.org/software/bash/manual/html_node/Quoting.html. As far as I know they are the single ' and double " quotes.

like image 23
Boris Avatar answered Sep 21 '22 15:09

Boris