在Makefile中运行时,读取提示无法正确打印

Ome*_*Gak 6 bash makefile

我正在尝试提示用户输入,但是read -p当从Makefile或Makefile启动的子shell中运行时,我无法按预期获得提示.以下是我尝试实现这一目标的努力:

test1:
    @echo '>> before input <<'; \
        read -p 'type something:' FOO; \
        echo '>> after input <<'; \
        echo $$FOO
Run Code Online (Sandbox Code Playgroud)

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

$ make
>> before input <<
asdf
>> after input <<
asdf
type something
Run Code Online (Sandbox Code Playgroud)

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

test2:
    @echo '>> before input <<'; \
        read -e -p 'type something:' FOO; \
        echo '>> after input <<'; \
        echo $$FOO
Run Code Online (Sandbox Code Playgroud)

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

我之前尝试过打印提示echo:

test3:
    @echo '>> before input <<'; \
        echo 'input something:';\
        read FOO; \
        echo '>> after input <<'; \
        echo $$FOO;\
Run Code Online (Sandbox Code Playgroud)

我的输出看起来几乎不错,但输入打印在换行符上:

$ make
>> before input <<
input something:
asdf
>> after input <<
asdf
Run Code Online (Sandbox Code Playgroud)

最后一次调整printf用于避免换行:

test4:
    @echo '>> before input <<'; \
        printf 'input something: ';\
        read FOO; \
        printf '\n'; \
        echo '>> after input <<'; \
        echo $$FOO;\
Run Code Online (Sandbox Code Playgroud)

read如果它没有结束,它似乎吃掉了提示\n:

$ make
>> before input <<
asdf
input something:
>> after input <<
asdf
Run Code Online (Sandbox Code Playgroud)

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

test5:
    ./script.sh
Run Code Online (Sandbox Code Playgroud)

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

免责声明:我知道让用户输入依赖Makefiles并不是一个好主意,但我需要这个特定的案例.

Ome*_*Gak 1

由于显然没有人可以重现我的问题,因此我认为我的环境中一定发生了某些事情导致了它。我终于发现原因潜伏在我的一堆调整中的某个地方.zshrc

事实证明,有问题的行是make添加着色的别名,它以某种方式修改了作为副作用grc的行为。read

alias make='grc make'
Run Code Online (Sandbox Code Playgroud)

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