Troque o Basename por Expansão de Parâmetros
Dica publicada em Linux / Avançado
Troque o Basename por Expansão de Parâmetros
Muitos usuários Linux que utilizam o shell ou até profissionais de TI que são programadores em shell, devem conhecer o basename. Ele geralmente é utilizado para adquirir o nome do script com o uso da variável "$0" como parâmetro, dessa forma por exemplo.
Isso retorna o nome do script. O echo foi para enfeite, só o comando e a variável padrão "$0" já dá a saída, mas talvez você queira colocar em uma mensagem para o parâmetro help. Só que existe uma maneira mais fácil de fazer isso como pode ser feito a seguir.
Que isso? Se você não entendeu nada, vou explicar melhor. Isso é expansão de parâmetros, ele age na pilha de dados diretamente no setor de processamento, o que o torna mais eficiente. A expansão apresentada anteriormente, tem a função de remover caracteres da esquerda para a direita. Sua sintaxe é: ${PARM#EXPR} ou ${PARM##EXPR}.
Existe um diferença entre os dois. O primeiro, remove apenas a primeira ocorrência e a segunda remove todas as ocorrências.
Agora é mais fácil de entender, o ## vai remover tudo o que casar com "*/" na variável "$0", sobrando só o nome do programa. O "*" é expandido pelo shell, o que faz com que os caracteres antes da barra fossem todos mapeados e fossem excluídos junto com a barra.
Mas isso é mesmo eficiente? Vamos fazer o teste usando time. Aqui, testamos 200 vezes o comando para ter um bom valor para comparação. Não tem nem comparação. Aqui, como não estamos em um script, setamos o local como parâmetro usando set, o que fez o local cair na variável $1.
Com essas reflexões, já podem largar do basename para usar expansão de parâmetros.
echo $(basename $0)
Isso retorna o nome do script. O echo foi para enfeite, só o comando e a variável padrão "$0" já dá a saída, mas talvez você queira colocar em uma mensagem para o parâmetro help. Só que existe uma maneira mais fácil de fazer isso como pode ser feito a seguir.
echo ${0##*/}
Que isso? Se você não entendeu nada, vou explicar melhor. Isso é expansão de parâmetros, ele age na pilha de dados diretamente no setor de processamento, o que o torna mais eficiente. A expansão apresentada anteriormente, tem a função de remover caracteres da esquerda para a direita. Sua sintaxe é: ${PARM#EXPR} ou ${PARM##EXPR}.
Existe um diferença entre os dois. O primeiro, remove apenas a primeira ocorrência e a segunda remove todas as ocorrências.
Agora é mais fácil de entender, o ## vai remover tudo o que casar com "*/" na variável "$0", sobrando só o nome do programa. O "*" é expandido pelo shell, o que faz com que os caracteres antes da barra fossem todos mapeados e fossem excluídos junto com a barra.
Mas isso é mesmo eficiente? Vamos fazer o teste usando time. Aqui, testamos 200 vezes o comando para ter um bom valor para comparação. Não tem nem comparação. Aqui, como não estamos em um script, setamos o local como parâmetro usando set, o que fez o local cair na variável $1.
Com essas reflexões, já podem largar do basename para usar expansão de parâmetros.