7

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?

  • 1
    .bashrc is only read if the shell is interactive. – user4556274 Aug 9 '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 9 '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 9 '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 9 '16 at 15:53
  • 1
    I edited the answer to address the color issue. – Matei David Aug 9 '16 at 16:30
7

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.

  • 1
    that works.... to your explanation, sure, but I am ssh ing to myself :) – Zanna Aug 9 '16 at 15:07
  • 1
    I meant in general when using ssh. Yes, with localhost that's not a problem. – Matei David Aug 9 '16 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"'. – Matei David Aug 9 '16 at 20:59
  • Aha I understand. Thanks a lot. I'm going to delete my comments :) – Zanna Aug 9 '16 at 21:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.