Você está passando um código shell para o script. Para o script, isso é apenas texto. Para que seja interpretado como um comando shell completo, você terá que eval
it:
eval "$1" >file1.tmp
eval "$2" >file2.tmp
Isso funciona quando $1
e $2
são coisas simples como echo hello
porque são comandos simples (não listas ou comandos compostos).
Uma analogia com outra linguagem de programação seria se você passasse uma parte do código C em um programa em C como uma cadeia de texto. O código teria que ser compilado (e vinculado) de alguma forma antes que pudesse ser executado como parte do programa.