$0 não contém o nome do programa de chamada, mas o nome do programa chamado. O programa chamado é ./my_command então $0 será ./my_command .
O fato de ser um link simbólico não faz diferença.
O parâmetro shell $0 contém o nome do programa de chamada. Se você criar um link simbólico chamado my_command em seu diretório inicial para o comando /usr/local/bin/command1 e executá-lo digitando ./my_command , qual será o valor de $0 ? Alguém pode também explicar por quê? Obrigado!
Uma linha de comando (ou melhor, no UNIX, uma matriz de argumentos de linha de comando), incluindo o que se tornaria $0 , é passada para o exec chama pelo programa de chamada.
Resolução de Symlink, shebang processing etc. só é feita depois disso, pelo sistema, como parte do processamento da chamada exec .
Assim, qualquer que seja o programa de chamada (o shell no seu caso) especificado como o primeiro item em argv ( /.my_command no seu caso) torna-se $0 .