1*e2eeea75SSimon J. Gerraty# $NetBSD: var-op-shell.mk,v 1.3 2020/11/09 20:39:46 rillig Exp $ 22c3632d1SSimon J. Gerraty# 32c3632d1SSimon J. Gerraty# Tests for the != variable assignment operator, which runs its right-hand 42c3632d1SSimon J. Gerraty# side through the shell. 52c3632d1SSimon J. Gerraty 6*e2eeea75SSimon J. Gerraty# The variable OUTPUT gets the output from running the shell command. 7*e2eeea75SSimon J. GerratyOUTPUT!= echo "success"'ful' 8*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "successful" 9*e2eeea75SSimon J. Gerraty. error 10*e2eeea75SSimon J. Gerraty.endif 11*e2eeea75SSimon J. Gerraty 12*e2eeea75SSimon J. Gerraty# Since 2014-08-20, the output of the shell command may be empty. 13*e2eeea75SSimon J. Gerraty# 14*e2eeea75SSimon J. Gerraty# On 1996-05-29, when the '!=' assignment operator and Cmd_Exec were added, 15*e2eeea75SSimon J. Gerraty# an empty output produced the error message "Couldn't read shell's output 16*e2eeea75SSimon J. Gerraty# for \"%s\"". 17*e2eeea75SSimon J. Gerraty# 18*e2eeea75SSimon J. Gerraty# The error message is still there but reserved for technical errors. 19*e2eeea75SSimon J. Gerraty# It may be possible to trigger the error message by killing the shell after 20*e2eeea75SSimon J. Gerraty# reading part of its output. 21*e2eeea75SSimon J. GerratyOUTPUT!= true 22*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "" 23*e2eeea75SSimon J. Gerraty. error 24*e2eeea75SSimon J. Gerraty.endif 25*e2eeea75SSimon J. Gerraty 26*e2eeea75SSimon J. Gerraty# The output of a shell command that failed is processed nevertheless. 27*e2eeea75SSimon J. Gerraty# TODO: Make this an error in lint mode. 28*e2eeea75SSimon J. GerratyOUTPUT!= echo "failed"; false 29*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "failed" 30*e2eeea75SSimon J. Gerraty. error 31*e2eeea75SSimon J. Gerraty.endif 32*e2eeea75SSimon J. Gerraty 33*e2eeea75SSimon J. Gerraty# A command with empty output may fail as well. 34*e2eeea75SSimon J. GerratyOUTPUT!= false 35*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "" 36*e2eeea75SSimon J. Gerraty. error 37*e2eeea75SSimon J. Gerraty.endif 38*e2eeea75SSimon J. Gerraty 39*e2eeea75SSimon J. Gerraty# In the output of the command, each newline is replaced with a space. 40*e2eeea75SSimon J. Gerraty# Except for the very last one, which is discarded. 41*e2eeea75SSimon J. GerratyOUTPUT!= echo "line 1"; echo "line 2" 42*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "line 1 line 2" 43*e2eeea75SSimon J. Gerraty. error 44*e2eeea75SSimon J. Gerraty.endif 45*e2eeea75SSimon J. Gerraty 46*e2eeea75SSimon J. Gerraty# A failing command in the middle results in the exit status 0, which in the 47*e2eeea75SSimon J. Gerraty# end means that the whole sequence of commands succeeded. 48*e2eeea75SSimon J. GerratyOUTPUT!= echo "before"; false; echo "after" 49*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "before after" 50*e2eeea75SSimon J. Gerraty. error 51*e2eeea75SSimon J. Gerraty.endif 52*e2eeea75SSimon J. Gerraty 53*e2eeea75SSimon J. Gerraty# NB: The signal number must be numeric since some shells (which ones?) don't 54*e2eeea75SSimon J. Gerraty# accept symbolic signal names. 14 is typically SIGALRM. 55*e2eeea75SSimon J. Gerraty# 56*e2eeea75SSimon J. Gerraty# XXX: The number of the signal is not mentioned in the warning since that 57*e2eeea75SSimon J. Gerraty# would have been difficult to implement; currently the errfmt is a format 58*e2eeea75SSimon J. Gerraty# string containing a single %s conversion. 59*e2eeea75SSimon J. GerratyOUTPUT!= kill -14 $$$$ 60*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "" 61*e2eeea75SSimon J. Gerraty. error 62*e2eeea75SSimon J. Gerraty.endif 63*e2eeea75SSimon J. Gerraty 64*e2eeea75SSimon J. Gerraty# A nonexistent command produces a non-zero exit status. 65*e2eeea75SSimon J. GerratyOUTPUT!= /bin/no/such/command 66*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "" 67*e2eeea75SSimon J. Gerraty. error 68*e2eeea75SSimon J. Gerraty.endif 69*e2eeea75SSimon J. Gerraty 70*e2eeea75SSimon J. Gerraty# The output from the shell's stderr is not captured, it just passes through. 71*e2eeea75SSimon J. GerratyOUTPUT!= echo "stdout"; echo "stderr" 1>&2 72*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "stdout" 73*e2eeea75SSimon J. Gerraty. error 74*e2eeea75SSimon J. Gerraty.endif 75*e2eeea75SSimon J. Gerraty 76*e2eeea75SSimon J. Gerraty# The 8 dollar signs end up as 4 dollar signs when expanded. The shell sees 77*e2eeea75SSimon J. Gerraty# the command "echo '$$$$'". The 4 dollar signs are stored in OUTPUT, and 78*e2eeea75SSimon J. Gerraty# when that variable is expanded, they expand to 2 dollar signs. 79*e2eeea75SSimon J. GerratyOUTPUT!= echo '$$$$$$$$' 80*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "\$\$" 81*e2eeea75SSimon J. Gerraty. error 82*e2eeea75SSimon J. Gerraty.endif 832c3632d1SSimon J. Gerraty 842c3632d1SSimon J. Gerratyall: 85