Prendiamo le cose passo dopo passo:
Quando si esegue questa operazione:
mycmd='cat $myfile'
Si impedisce alla shell di interpolare $myfile
. Così:
$ echo $mycmd
cat $myfile
Se si desidera consentire l'interpolazione, è possibile utilizzare le virgolette doppie:
$ mycmd="echo $myfile" #Double quotes!
$ echo "$mycmd"
cat afile.txt
Questo, naturalmente, si blocca l'interpretazione di $mycmd
quando si fa un eval
.
$ myfile="afile.txt"
$ mycmd="echo $myfile"
$ echo $mycmd
cat afile.txt
$ eval $mycmd #Prints out afile.txt
$ myfile=bfile.txt
$ eval $mycmd #Still prints out afile.txt and not bfile.txt
confrontare questo a:
$ myfile="afile.txt"
$ mycmd='cat $myfile' #Single quotes hide $myfile from the shell
echo $mycmd
cat $myfile #Shell didn't change "$myfile", so it prints as a literal
$ eval $mycmd #Prints out afile.txt
$ myfile=bfile.txt
$ eval $mycmd #Now prints out bfile.txt
Quello che probabilmente vuole fare è quello di valutare l'$mycmd
in un enunciato echo quando si echo è:
$ echo $(eval "echo $mycmd")
$ cat afile.txt
$ myfile=bfile.txt
$ echo $(eval "echo $mycmd")
cat bfile.txt
fonte
2013-08-13 21:57:46
Questo non funziona per : grep fatal 'find/var/log/-name 'current' – taco