$* é todos os parâmetros para o script ou função, dividido em argumentos separados no espaço em branco.
Se você tem uma função:
foo() {
for x in $*
do
echo $x
done
}
então, a execução de foo 1 "2 3 4" 5 será exibida:
1
2
3
4
5
Ou seja, a string citada "2 3 4" será dividida em três "palavras" separadas.
Quando você não deseja dividir os argumentos em palavras separadas como essa, você pode usar $@ . Se a mesma função usasse "$@" no lugar de $* , seria produzida:
1
2 3 4
5
Ou seja, a string citada não seria dividida em palavras separadas. Isso é como listar todos os parâmetros posicionais explicitamente: "$1" "$2" "$3" "$4" ... . Em geral, esse é provavelmente o que você deseja usar - a divisão de palavras geralmente leva a erros desagradáveis difíceis de rastrear.
No nível superior de um script (não dentro de uma função), eles se referem aos argumentos dados ao próprio script.
Seu exemplo está chamando run_command ou run_test com todos os argumentos para esse script ou função, dividido em palavras separadas. Se o script fosse executado como script.sh "hello world" 2 3 , ele teria o efeito de executar:
run_command hello world 2 3