我正在尝试提示用户输入,但是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并不是一个好主意,但我需要这个特定的案例.
由于显然没有人可以重现我的问题,因此我认为我的环境中一定发生了某些事情导致了它。我终于发现原因潜伏在我的一堆调整中的某个地方.zshrc。
事实证明,有问题的行是make添加着色的别名,它以某种方式修改了作为副作用grc的行为。read
alias make='grc make'
Run Code Online (Sandbox Code Playgroud)
删除它可以解决所有问题,但最终,我的解决方案是在正常情况下保留着色别名,并command make在需要用户输入时简单地调用。