Bash: sobrescrevendo ls -la com ls -la | mais (problema básico de script do bash)

0

Muito novo no bash scripting. Tentando superar o comando ls -la para ser: ls -la | mais

(parece mais útil para mim).

Adicionei isso ao final do meu .bashrc .

154 # alias 'ls -la'='ls -la | more'
155         # this did not work because aliases
156         # are not allowed to have spaces in
157         # them. => have to make function:
158 ls() {
159         if [[ $@ == "-la" ]];
160         then
161                echo "test";
162                 command ls -la | more;
163         else
164                 command ls "$@";
165         fi;
166 }

Mas recebo este erro quando abro um novo terminal:

bash: /users/me/.bashrc: line 158: syntax error near unexpected token '('
bash: /users/me/.bashrc: line 158: 'ls() {'

Quando adiciono function antes de ls() { , não há reclamações, mas não há mudança no comportamento de ls. Obrigado.

Atualizar

Tentando refinar o problema, fiz isso:

159 ls() {
160         #if [[ $@ == "-la" ]];
161        # then
162                echo "test"
163 #               command ls -la | grep vim;
164         #else
165         #        command ls "$@";
166         #fi;
167 }

mas ainda recebo o mesmo erro. Eu acho que o principal problema pode estar no arquivo bashrc?

Atualizar

Estranhamente isso funciona

159 function ls() {
160         #if [[ $@ == "-la" ]];
161        # then
162                echo "test"
163 #               command ls -la | grep vim;
164         #else
165         #        command ls "$@";
166         #fi;
167 }
    
por sixtyfootersdude 08.02.2010 / 17:13

3 respostas

1

Não consigo reproduzir isso no Bash-3.00.16 no Solaris 10 ou no Cygwin, mas parece que o seu bash está analisando a linha 158 como uma invocação do comando ls , e não como uma definição de função.

O prefixo "function" é opcional, mas se ele faz o seu bash aceitar a definição, então é uma solução razoável. Não altera de maneira nenhuma o significado da função.

Aliás, qual versão do OS e do Bash você está usando?

uname -a
bash --version
    
por 08.02.2010 / 17:41
4

Eu percebo que isso não é exatamente o que você está perguntando, mas eu menciono isso caso você não tenha pensado sobre esse tipo de solução. Na minha experiência, a maneira usual de contornar isso é criar um alias sem espaço, por exemplo:

alias llm="ls -la | more"

Isso é muito mais rápido e fácil do que escrever um script. FWIW, eu testei isso em um sistema FreeBSD 5.3 rodando o Bash 3.0 e ele forneceu uma listagem de mais.

    
por 08.02.2010 / 18:18
1

substitua por:

 function ls
 {
         if [[ $@ == "-la" ]]
         then
                echo "test"
                /bin/ls -la | more
         else
                /bin/ls "$@"
         fi;     
}

Nota: você precisará referenciar o caminho absoluto para o comando ls real dentro do if ou que irá reinvocar a mesma função e .... stackoverflow! : -)

EDIT: Sim, a palavra-chave de comando é uma maneira melhor de evitar pesquisas de alias.

    
por 08.02.2010 / 18:08