我试图提示用户输入,但是当从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并不是一个好主意,但我需要这个非常特殊的情况。
答案 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
。