Questão Bash: espaços no nome do alias


Eu estou tentando criar um aliases no bash. O que eu quero fazer é mapear ls -la para ls -la | more

No meu arquivo .bashrc é isso que eu tentei:

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

No entanto, não funciona porque (eu suponho) tem espaços no nome do alias. Existe um trabalho para isso?


96


origem


Por que não fazer alias lsm='ls -la | more' - Nifle


Respostas:


o Documentação de bash states "Para quase todos os propósitos, as funções de shell são preferidas sobre aliases." Aqui está uma função shell que substitui ls e faz com que a saída seja canalizada para more se o argumento consistir em (apenas) -la.

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

Como um one-liner:

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

Automaticamente saída de tubos:

ls -la

100



Por que você precisa usar colchetes duplos dentro da instrução if? - sixtyfootersdude
@sixtyfootersdude: O formulário de suporte duplo é mais poderoso e eu uso por hábito. Vejo mywiki.wooledge.org/BashFAQ/031 - Dennis Williamson
Então, qual é o comando final? alias ls = 'ls ()' ?? - Jeef
@Jeef: Não, minha resposta usa uma função em vez de de um alias. Eu editei para tentar deixar mais claro. - Dennis Williamson
@merlinpatt: command impede que a função seja chamada recursivamente. - Dennis Williamson


De alias man page:

A primeira palavra de cada comando simples,   se não estiver marcado, é verificado para ver se   tem um alias. Se sim, essa palavra é   substituído pelo texto do alias. o   nome do alias e o texto de substituição   pode conter qualquer entrada de shell válida,   incluindo metacaracteres de shell, com   a exceção que o nome do alias pode   não contém `= '.

Portanto, apenas a primeira palavra é verificada para correspondências de alias, o que torna os aliases de várias palavras impossíveis. Você pode ser capaz de escrever um script de shell que verifica os argumentos e chama o seu comando se eles coincidirem e, caso contrário, apenas chamará o normal ls (Vejo @Dennis Williamson's answer)


42



+ 1 para explicar por que não tenho permissão para usar ls -la como um alias. - sixtyfootersdude
Isso foi útil porque, em vez de tentar resolvê-lo, respondeu à pergunta. Eu vim aqui porque queria criar um alias com um espaço e isso não aconteceria. - angryundead


Uma abordagem ligeiramente melhorada 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 outras opções / argumentos sejam acrescentados após o comando, se necessário, por exemplo ls -la -h


13



Como isso lida se eu quiser ls -lat ser excluído deste tratamento? Eu precisaria colocar um caso para lidar com isso acima do -la* entrada, sim? - Steven Lu


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


-2