É uma questão confusa com os caminhos e su'ing. Quando você executa este comando:
$java -cp ./classes:./lib com.mystuff.bar.foo.myclass
E receba 'class not found', isso significa que java não é capaz de encontrar essa classe em ./classes ou ./lib. Se você quer
a) use caminhos absolutos ou b) cd no lugar certo antes de executar o comando (su scriptuser -c "cd $ home; ./$ program")
funcionará de forma mais confiável.
Por que adicionar um "/" ao home faz a diferença, isso parece muito estranho. Você poderia quebrar strace / truss e ver qual sistema chama o comando está fazendo. Esta resposta cita a especificação do posix:
Como o linux lida com vários separadores de caminho (/ home //// username /// file)
e diz "Para programas que atuam em uma entrada de diretório, se foo é um link simbólico para um diretório, então passar foo / é uma maneira de fazer o programa agir no diretório em vez do link simbólico."