Weźmy wszystko krok po kroku:
Kiedy to zrobić:
mycmd='cat $myfile'
Uniemożliwia interpolację powłoki $myfile
. Zatem:
$ echo $mycmd
cat $myfile
Jeśli chcesz zezwolić na interpolację, można użyć cudzysłowia:
$ mycmd="echo $myfile" #Double quotes!
$ echo "$mycmd"
cat afile.txt
To, oczywiście, zamarza interpretacja $mycmd
kiedy zrobić 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
Porównaj to:
$ 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
Co prawdopodobnie chcesz zrobić jest ocena $mycmd
w instrukcji echo kiedy to echo:
$ echo $(eval "echo $mycmd")
$ cat afile.txt
$ myfile=bfile.txt
$ echo $(eval "echo $mycmd")
cat bfile.txt
To nie działa na : grep fatal 'find/var/log/-name 'current' – taco