在Makefile中运行时,读取提示不能正确打印

时间:2015-06-07 12:38:34

标签: bash makefile

我试图提示用户输入,但是当从Makefile或Makefile启动的子shell中运行时,我无法按预期获得read -p提示。以下是我未能成功实现此目标的尝试:

test1:
    @echo '>> before input <<'; \
        read -p 'type something:' FOO; \
        echo '>> after input <<'; \
        echo $$FOO

假设输入asdf,输出看起来像这样。我的输入在我输入时打印,但提示符type something:在其他所有内容后打印出来:

$ make
>> before input <<
asdf
>> after input <<
asdf
type something

我尝试的另一种方法是使用Bash的readline界面read -e

test2:
    @echo '>> before input <<'; \
        read -e -p 'type something:' FOO; \
        echo '>> after input <<'; \
        echo $$FOO

在这种情况下,输出看起来不错,但是,在我按下type something:之后,提示ENTER和我输入的实际输入都没有打印,这在请求输入时非常不方便。

我还尝试使用echo

打印提示
test3:
    @echo '>> before input <<'; \
        echo 'input something:';\
        read FOO; \
        echo '>> after input <<'; \
        echo $$FOO;\

我的输出看起来很好,但输入打印在换行符上:

$ make
>> before input <<
input something:
asdf
>> after input <<
asdf

使用printf进行最后一次调整以避免换行:

test4:
    @echo '>> before input <<'; \
        printf 'input something: ';\
        read FOO; \
        printf '\n'; \
        echo '>> after input <<'; \
        echo $$FOO;\

如果read没有以\n结尾,$ make >> before input << asdf input something: >> after input << asdf 似乎会消失提示:

test5:
    ./script.sh

当然,如果我只是调用一个脚本,就会发生同样的事情:

{{1}}

如果它有助于发现问题:OS X 10.10.3 / make 3.81 / bash 3.2.57(1)。

免责声明:我知道让用户输入依赖Makefiles并不是一个好主意,但我需要这个非常特殊的情况。

3 个答案:

答案 0 :(得分:0)

对于test 3,您可以使用echo -n在同一行打印邮件,而不会显示\n

答案 1 :(得分:0)

在您的示例中,您基本上运行一个shell命令。可以运行一系列命令,我认为这就是你想要的。例如试试这个。放入你的Makefile:

test1:
    @echo '>> before input <<'
    read -p 'type something: ' FOO; \
    echo '>> after input <<'; \
    echo $$FOO

请注意,第一个@echo上没有分号和反斜杠。

答案 2 :(得分:0)

由于显然没有人可以重现我的问题,我认为我必须在我的环境中发生一些事情。我终于发现原因是在.zshrc内的一堆调整中潜伏着。

违规行被证明是别名make,用于添加grc的着色,以某种方式修改read作为副作用的行为。

alias make='grc make'

删除它可以解决所有问题,但最后,我的解决方案是在正常情况下保留着色的别名,并在需要用户输入时调用command make