我试图提示用户输入,但当从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上没有分号和反斜杠。