Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 读取Makefile脚本中的用户输入_Shell_Makefile - Fatal编程技术网

Shell 读取Makefile脚本中的用户输入

Shell 读取Makefile脚本中的用户输入,shell,makefile,Shell,Makefile,我有一个非常简单的Makefile(它只是递归调用另一个子目录make): 我想做的是 检查是否定义了外壳变量ENV_VAR 如果是,则像往常一样运行Makefile(即,ENV_VAR=1 make all应该完全按照上面的make all执行) 如果没有,则向用户提示消息“警告:未定义环境变量;是否继续?[Y/n]”,其中输入“Y”会像往常一样通过make all和make run,输入“n”只会回显消息并退出 我知道要在bash中实现这一点,您需要结合使用echo和read函数。但是在Ma

我有一个非常简单的Makefile(它只是递归调用另一个子目录make):

我想做的是

  • 检查是否定义了外壳变量
    ENV_VAR
  • 如果是,则像往常一样运行Makefile(即,
    ENV_VAR=1 make all
    应该完全按照上面的
    make all
    执行)
  • 如果没有,则向用户提示消息“警告:未定义环境变量;是否继续?[Y/n]”,其中输入“Y”会像往常一样通过
    make all
    make run
    ,输入“n”只会回显消息并退出

  • 我知道要在bash中实现这一点,您需要结合使用
    echo
    read
    函数。但是在Make中如何做到这一点还不清楚。

    Make并不是真正的交互功能,但您可以对其进行模糊处理

    有多种方法可以做到这一点,但由于您似乎希望此行为特定于某些目标(
    all
    run
    ),我会添加一个与用户交互的虚假目标,可能会中止生成:

    all run: check
    
    .PHONY: check
    check:
    ifndef ENV_VAR
        @echo Warning: ENV_VAR isn\'t defined\; continue? [Y/n]
        @read line; if [ $$line = "n" ]; then echo aborting; exit 1 ; fi
    endif
    

    注意,我对一个变量使用Make条件,对另一个变量使用bash条件。您可以使用任意一种方式,但在本例中,这是最干净的方式。

    Make并不是真正用于交互的,但您可以将其混在一起

    有多种方法可以做到这一点,但由于您似乎希望此行为特定于某些目标(
    all
    run
    ),我会添加一个与用户交互的虚假目标,可能会中止生成:

    all run: check
    
    .PHONY: check
    check:
    ifndef ENV_VAR
        @echo Warning: ENV_VAR isn\'t defined\; continue? [Y/n]
        @read line; if [ $$line = "n" ]; then echo aborting; exit 1 ; fi
    endif
    

    注意,我对一个变量使用Make条件,对另一个变量使用bash条件。您可以使用任意一种,但在本例中,这是最干净的方法。

    如果您知道如何在
    bash
    中执行此操作,请使用
    bash
    ,即
    bash-c“…”
    作为将来的参考,一个好问题不应该像洋葱一样分层。如果您想知道如何读取makefile中的用户输入,请询问;您的问题是如何做到这一点,以及如何在结果的基础上分支构建,并使整个过程以一个环境变量为条件。请注意,如果您这样做,则无法在GNU make(
    -j
    )中使用并行模式。因为作业是并行运行的,所以只有一个作业会被分配到stdin,而你不知道是哪一个。@madcascitist:我没想到。也许有一种方法可以解决这个问题,但重新思考整个项目可能更明智。如果你知道如何在
    bash
    中完成它,请使用
    bash
    ,即
    bash-c“…”
    作为将来的参考,一个好问题不应该像洋葱一样分层。如果您想知道如何读取makefile中的用户输入,请询问;您的问题是如何做到这一点,以及如何在结果的基础上分支构建,并使整个过程以一个环境变量为条件。请注意,如果您这样做,则无法在GNU make(
    -j
    )中使用并行模式。因为作业是并行运行的,所以只有一个作业会被分配到stdin,而你不知道是哪一个。@madcascitist:我没想到。也许有办法解决这个问题,但重新考虑整个项目可能会更明智。考虑到这些限制,这是一个优雅的解决方案。有没有一种更惯用的方法可以不用制作(如果你知道我很好奇的话,不必回答)?@乔治:我不知道你说的“更惯用”是什么意思,但你当然可以不用制作就做。例如,您可以使用带有嵌套条件的bash脚本;如果[$$line=“n”];然后回声中止;出口1;fi否则POSIX sh将无法理解字符串相等的问题,@AndrzejPiszczek:很好,谢谢!我将编辑。考虑到约束条件,这是一个优雅的解决方案。有没有一种更惯用的方法可以不用制作(如果你知道我很好奇的话,不必回答)?@乔治:我不知道你说的“更惯用”是什么意思,但你当然可以不用制作就做。例如,您可以使用带有嵌套条件的bash脚本;如果[$$line=“n”];然后回声中止;出口1;fi否则POSIX sh将无法理解字符串相等的问题,@AndrzejPiszczek:很好,谢谢!我来编辑。