16

I have an alias defined in my .bashrc

alias l.='ls -d .* --color=auto'

It's very useful :) but it doesn't work via ssh:

$ ssh localhost l.
bash: l.: command not found

Why is that?

Zanna
  • 70,465
  • 2
    .bashrc is only read if the shell is interactive. – user4556274 Aug 09 '16 at 15:05
  • 1
    With your alias over ssh, there will probably be no color, where if you change your alias to alias l.='ls -d .* --color' then the colors appear. Just thought I would add that. At least I was experiencing that. – Terrance Aug 09 '16 at 15:44
  • @Terrance I was wondering about that... I still get no colour (and no columns) although I get colour (and columns) as before after changing the alias (and doing source .bashrc) – Zanna Aug 09 '16 at 15:49
  • 1
    ah ha! I think I got it. Try your alias as alias l.='ls -dC .* --color' where the C shows columns. – Terrance Aug 09 '16 at 15:53
  • Aha I get columns! I know C is for columns but normally I get them without asking... still no colour... (I'm not spelling it the British way in my alias, promise ;) ) @Terrance – Zanna Aug 09 '16 at 15:58
  • What terminal application are you using? I am doing my tests in xfce4-terminal. – Terrance Aug 09 '16 at 16:01
  • 1
    I edited the answer to address the color issue. – Matei David Aug 09 '16 at 16:30
  • @Terrance MATE terminal... – Zanna Aug 09 '16 at 18:54
  • Is the color still not showing up with the answer Matei gave below? – Terrance Aug 09 '16 at 19:37
  • @Terrance yes it does work (as I commented on the answer) – Zanna Aug 09 '16 at 20:24

1 Answers1

18

Try:

ssh localhost -t bash -ci l.

Note:

  • The alias should be in ~/.bashrc on the remote server, not on your local machine.

  • The -i option tells bash to run an interactive shell. Aliases are enabled by default only in interactive shells.

  • The -t options tells ssh to allocate a pseudo-tty. Without this, bash emits a warning message when started in interactive mode. This also enables ls colors. Without it, you'd have to use --color=always, see man ls.

  • There is another way to enable aliases, without setting the interactive flag, namely shopt -s expand_aliases. So you could try:

    ssh localhost 'bash -c "shopt -s expand_aliases; l."'
    

    However:

    • Your .bashrc might only define aliases if the shell sourcing it is interactive. In this example, the shell would not be interactive at that time.

    • If you try to define aliases on the same line, see this.

Matei David
  • 681
  • 5
  • 7