Aproveite o fato de que o caminho é pesquisado para aplicativos.
roadmr@blackdog:~$ which firefox
/usr/bin/firefox
roadmr@blackdog:~$ echo $PATH
/home/roadmr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Então, quando você tentar executar o "firefox", ele será procurado nesses diretórios e, eventualmente, será encontrado em /usr/bin e executado.
Mas se você colocar um wrapper chamado firefox em, por exemplo, /usr/local/bin , que faz as ações pré-executadas que você precisa e acaba chamando /usr/bin/firefox (caminho absoluto aqui, ou você vai acabar em um loop), então este wrapper será usado sempre que alguém executar apenas o "firefox" (e observe que o .Desktop launcher também especifica apenas "firefox", um nome relativo que ainda pesquisará no PATH ). Isso ocorre porque /usr/local/bin/firefox vem antes de /usr/bin/firefox na ordem de pesquisa de caminho.