I had a file similar to the one shown below
$ more dean.txt 2017-12-02 18:16:57 17279 [ERROR] ** TEST ERROR ** Error_code: 1007
When I ran the below command from the command line, it displays the correct information:
$ cat dean.txt | grep -i error_code 2017-12-02 18:16:57 17279 [ERROR] ** TEST ERROR ** Error_code: 1007
However, when I set up an environment variable as:
$ DEAN=`cat dean.txt | grep -i error_code`
And I run the command via the environment variable:
$ echo $DEAN 2017-12-02 18:16:57 17279 [ERROR] 0 bin COPYING COPYING.AGPLv3 COPYING.GPLv2 COPYING-jemalloc dean.txt docs include lib log_archives man my.cnf my.cnf.bak.20171121 my.cnf.dean.bak mysql-files mysql-test PATENTS README.md README.MySQL share support-files TEST ERROR 0 bin COPYING COPYING.AGPLv3 COPYING.GPLv2 COPYING-jemalloc dean.txt docs include lib log_archives man my.cnf my.cnf.bak.20171121 my.cnf.dean.bak mysql-files mysql-test PATENTS README.md README.MySQL share support-files Error_code: 1007
It lists all the files in the directory because it is interpreting the “*” in the file’s contents as a listing of all files.
Change the file contents to:
$ more dean.txt 2017-12-02 18:16:57 17279 [ERROR] TEST ERROR Error_code: 1007
And reset the environment variable:
$ DEAN=`cat dean.txt | grep -i error_code`
And execute the command
$ echo $DEAN 2017-12-02 18:16:57 17279 [ERROR] TEST ERROR Error_code: 1007
The workaround is to put the variable in quotes as shown below.
$ more dean.txt 2017-12-02 18:16:57 17279 [ERROR] ** TEST ERROR ** Error_code: 1007 $ DEAN=`cat dean.txt | grep -i error_code` $ echo "$DEAN" 2017-12-02 18:16:57 17279 [ERROR] ** TEST ERROR ** Error_code: 1007