Somente se em “/”: alias ls = 'ls -I test'?

5

Eu tenho o seguinte em ~/.bashrc para ocultar a listagem de test da saída de ls :

alias ls='ls -I test'

Mas só quero ocultar test se meu diretório de trabalho atual for a pasta raiz ( / ), não se eu estiver em outra pasta.

Como posso conseguir isso?

    
por Tomasz 02.03.2017 / 10:00

3 respostas

10

Algo parecido com isto, pensei que funcionaria:

alias ls='[[ "$PWD" = "/" ]] && ls -I test ||ls'

$PWD é o diretório de trabalho atual
&& tem a ação a executar se pwd for / (verificação de condição = true)
|| tem a ação a ser executada se pwd não for / (condição check = false)

Mas depois de um teste cuidadoso acima da solução, NÃO ESTÁ FUNCIONANDO corretamente.

Por outro lado, isso funcionará bem como alternativa às funções:

alias ls='{ [[ "$PWD" == "/" ]] && a="-I tmp2" ||a=""; };ls $a '

Ou melhor ainda, semelhante a outras respostas, mas sem necessidade de função:

alias lstest='{ [[ "$PWD" == "/" ]] && set -- "-I" "tmp2" || set --; }; ls "$@"'

Possíveis flags extras e / ou caminhos completos fornecidos na linha de comando ao invocar esse alias são preservados e enviados para ls.

    
por 02.03.2017 / 10:09
34
ls () {
  case "$PWD" in
    /) command ls -I test "$@" ;;
    *) command ls "$@" ;;
  esac
}

A função shell acima testará o diretório atual em relação a / e executará o comando (GNU) ls de maneira diferente, de acordo com o resultado do teste.

"$@" será substituído pelas opções de linha de comando e operandos na linha de comando original.

Precisamos usar command ls em vez de apenas ls na função para ignorar a pesquisa da função shell para ls (o que nos daria uma agradável recursão infinita).

Note que isso não usa o padrão de ignorar se estiver fazendo ls / de algum outro lugar, e que irá usar o padrão de ignorar se estiver fazendo, por exemplo, ls /home/dvoo de / .

Para tornar mais fácil lembrar o que isso realmente faz (seis meses depois, quando você se perguntar o que está fazendo), use as opções longas:

ls () {
  case "$PWD" in
    /) command ls --ignore='test' "$@" ;;
    *) command ls "$@" ;;
  esac
}

Implementação alternativa da função acima que só chamará ls de um lugar (e que é mais curto):

ls () {
  [ "$PWD" = "/" ] && set -- --ignore='test' "$@"
  command ls "$@"
}
    
por 02.03.2017 / 10:13
22

Use uma função que testa se você está em / para ls :

ls () {
    if [[ "$PWD" == / ]]
    then
        command ls -I test "$@"
    else
        command ls "$@"
    fi
}

Dessa forma, todos os argumentos que você passar para ls ainda serão usados.

Ou:

ls () {
    if [ "$PWD" == / ]
    then
        set -- -I test "$@"
    fi
    command ls "$@"
}
    
por 02.03.2017 / 10:10

Tags