问题
From Table 7-1 of Bash Guide for Beginners, we can say that [ FILE1 -ot FILE2 ] will yield True if FILE1 is older than FILE2, or if FILE2 exists and FILE1 does not. Executing this command on shell returns True if FILE1 is absent and FILE2 is present. However, when I made use of this in my make script, it yielded False whenever FILE1 was absent and FILE2 was present. To be precise, I made use of the following command in my make and shell scripts:
[ FILE1 -ot FILE2 ] && echo 1 || echo 0
Running this command on shell returned 1 whenever it was expected to. However, running this command via make resulted in 1 only when FILE1 existed and was found to be older than FILE2. In other scenarios, i.e. whenever FILE1 was not found to be older than FILE2 OR whenever FILE1 was absent and FILE2 existed, the above command yielded 0 in my make script. Note that in my make script, I'm storing the results of the above command in a global variable. This global variable is later used in one of the recipes by a conditional.
So, I wish to know whether this is a bug/feature in make OR a possible issue from my end(due to some typo or other possible sources of error)?
Note : I'm using GNU Make 4.1 on Ubuntu 18.04.3
回答1:
Try this experiment (in a script):
In the case I tested: when file1 does not exist and when file2 does exist:
#!/bin/sh
[ file1 -ot file2 ] && echo "file1 older" || echo "file2 older"
yields file2 older
#!/bin/bash
[ file1 -ot file2 ] && echo "file1 older" || echo "file2 older"
yields file1 older
By default make will use #!/bin/sh as the shell, you can change this by: SHELL = /bin/bash in your makefile
I am not sure why this is different - its just a different implementation between sh and bash...
来源:https://stackoverflow.com/questions/63643950/executing-file1-ot-file2-yields-different-results-in-make-and-shell