Bash: Espaços no nome alternativo


117

Estou tentando criar um alias no bash. O que eu quero fazer é mapear ls -laparals -la | more

No meu arquivo .bashrc, foi isso que tentei:

alias 'ls -la'='ls -la | more'

No entanto, ele não funciona porque (presumo) ele possui espaços no nome alternativo. Existe uma solução alternativa para isso?


8
Por que não fazeralias lsm='ls -la | more'
Nifle

Respostas:


126

A documentação do Bash indica "Para quase todos os fins, as funções do shell são preferidas aos aliases". Aqui está uma função shell que substitui lse faz com que a saída seja canalizada morese o argumento consistir em (somente) -la.

ls() {
    if [[ $@ == "-la" ]]; then
        command ls -la | more
    else
        command ls "$@"
    fi
}

Como uma linha:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

Saída de tubo automaticamente:

ls -la

1
por que você precisa usar colchetes duplos na instrução if?
Sixtyfootersdude

1
@sixtyfootersdude: A forma de colchete duplo é mais poderosa e eu a uso por hábito. Veja mywiki.wooledge.org/BashFAQ/031
Dennis Williamson

Então, qual é o comando final? alias ls = 'ls ()' ??
perfil completo de Jeef

1
@ Jeef: Não, minha resposta usa uma função em vez de um apelido. Eu o editei para tentar torná-lo mais claro.
Dennis Williamson

6
@merlinpatt: commandimpede que a função seja chamada recursivamente.
Dennis Williamson

53

Na página de manual do alias :

A primeira palavra de cada comando simples, se não estiver entre aspas, é verificada para ver se ele possui um alias. Nesse caso, essa palavra é substituída pelo texto do alias. O nome alternativo e o texto de substituição podem conter qualquer entrada válida do shell, incluindo os metacaracteres do shell, com a exceção de que o nome alternativo não pode conter `= '.

Portanto, apenas a primeira palavra é verificada quanto a correspondências de alias, o que torna impossível os alias de várias palavras. Você pode escrever um script de shell que verifique os argumentos e chame o seu comando se eles corresponderem e apenas chamar o normal ls(consulte a resposta de @Dennis Williamson )


8
+1 Para explicar por que não tenho permissão para usar ls -la como um alias.
sixtyfootersdude

7
Isso foi útil porque, em vez de tentar resolvê-lo, ele respondeu à pergunta. Eu vim aqui porque queria criar um alias com um espaço e isso simplesmente não acontecerá.
angryundead

Isso não apenas respondeu à minha pergunta, mas me deu informações valiosas sobre como o mecanismo de aliasing realmente funciona. Sua cotação na página de manual foi bastante útil.
Lily Finley

14

Uma abordagem ligeiramente aprimorada, extraída da resposta de Dennis:

function ls() {
  case $* in
    -la* ) shift 1; command ls -la "$@" | more ;;
    * ) command ls "$@" ;;
  esac
}

Ou o one-liner:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }

Isso permite que mais opções / argumentos sejam anexados após o comando, se necessário, por exemplo ls -la -h


2
Como isso funciona se eu quero ls -latser excluído deste tratamento? Eu precisaria colocar um caso para lidar com isso acima da -la*entrada, sim?
9159 Steven

-1

Você ainda pode chamar esse alias, mas precisa de cotação para que o espaço faça parte da palavra de comando. Então "ls -la" -p patternvai passar a -p patternopção para more, não ls.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.