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?

10
  • 2
    .bashrc is only read if the shell is interactive. Aug 9, 2016 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 9, 2016 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 9, 2016 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 9, 2016 at 15:53
  • 1
    I edited the answer to address the color issue. Aug 9, 2016 at 16:30

1 Answer 1

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.

4
  • 1
    that works.... to your explanation, sure, but I am ssh ing to myself :)
    – Zanna
    Aug 9, 2016 at 15:07
  • 1
    I meant in general when using ssh. Yes, with localhost that's not a problem. Aug 9, 2016 at 15:09
  • ssh ... <cmd> exits when <cmd> is done. If you want to keep the shell around after ls, try ssh localhost -t 'bash -ci "l.; exec bash"'. Aug 9, 2016 at 20:59
  • Aha I understand. Thanks a lot. I'm going to delete my comments :)
    – Zanna
    Aug 9, 2016 at 21:10

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .