out=tar -tf $1 | awk -F/ '{if (NF<3) print }'
executa a variável de ambiente -tf $1 com out definida como tar .
O que você deve realmente fazer é:
list-tar() {
if [[ $1 ]];then
tar -tf "$1" | awk -F/ 'NF<3'
fi
}
Observe a simplificação do programa awk : a ação padrão é {print} , então usei NF<3 como a regra que deve ser verdadeira para que a ação aconteça. (As regras não precisam ser /regex/ patterns (cujo padrão é corresponder a $0 ).) Um simples grep para linhas com menos de dois caracteres / também funcionaria.
Note também que capturar a saída em uma variável shell e, em seguida, ecoar é bobagem, a menos que você queira fazer algo com ela. Sua versão também quebra em nomes de arquivos com espaços neles. echo $out word-splits $out e, em seguida, echo space-separates multiple arguments. Então, vários espaços em branco se transformam em um único espaço, e você não pode dizer a diferença entre um espaço em um nome de arquivo e dois arquivos separados.
[[ $1 ]] é uma maneira melhor / mais óbvia de gravar [[ -n $1 ]] para testar uma variável de shell não vazia. Isso explica algumas das diferenças entre [ e [[ .
As funções do shell podem ser executadas como comandos, portanto, a menos que você tenha algum outro motivo ou esquema de nomenclatura, apenas dê à função o nome abreviado e não se preocupe com o alias.