在生成文件中运行时,读取提示无法正确打印



我试图提示用户输入,但当从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;

如果不以n:

结束,read似乎会吃掉提示符。
$ make
>> before input <<
asdf
input something:
>> after input <<
asdf

当然,如果我只是调用一个脚本,也会发生完全相同的情况:

test5:
    ./script.sh

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

免责声明:我知道让用户输入依赖于makefile不是一个好主意,但是我需要在一个非常特殊的情况下使用它。

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

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

alias make='grc make'

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

对于test 3,您可以使用echo -n在同一行上打印您的消息,而不需要尾随n

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

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

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

最新更新