Tôi đang cố nhắc người dùng nhập nhưng tôi gặp sự cố để nhận được lời nhắc read -p
được in như mong đợi khi chạy từ bên trong một tệp Makefile hoặc một vỏ con được Bắt đầu bằng Makefile. Dưới đây là những nỗ lực của tôi vào việc đạt được điều này mà không thành công:đọc lời nhắc không in chính xác khi chạy trong Makefile
test1:
@echo '>> before input <<'; \
read -p 'type something:' FOO; \
echo '>> after input <<'; \
echo $$FOO
Kết quả trông như thế này giả sử tôi nhập asdf
. đầu vào của tôi được in như tôi gõ, nhưng dấu nhắc type something:
được in sau khi mọi thứ khác:
$ make
>> before input <<
asdf
>> after input <<
asdf
type something
Một cách khác tôi đã cố gắng sử dụng giao diện readline Bash của read -e
:
test2:
@echo '>> before input <<'; \
read -e -p 'type something:' FOO; \
echo '>> after input <<'; \
echo $$FOO
Trong trường hợp này đầu ra có vẻ tốt, tuy nhiên, không phải dấu nhắc type something:
cũng như đầu vào thực tế khi tôi nhập được in cho đến sau khi tôi đã nhấn ENTER
, điều này khá bất tiện khi yêu cầu đầu vào.
Tôi cũng đã cố gắng in dấu nhắc trước với echo
:
test3:
@echo '>> before input <<'; \
echo 'input something:';\
read FOO; \
echo '>> after input <<'; \
echo $$FOO;\
Và đầu ra của tôi trông gần tốt, nhưng đầu vào được in trên một dòng mới:
$ make
>> before input <<
input something:
asdf
>> after input <<
asdf
Một dấu ngắt cuối cùng sử dụng printf
để tránh dòng mới:
test4:
@echo '>> before input <<'; \
printf 'input something: ';\
read FOO; \
printf '\n'; \
echo '>> after input <<'; \
echo $$FOO;\
Và có vẻ như read
gặm nhấm đời sống kịp thời nếu nó không kết thúc với \n
:
$ make
>> before input <<
asdf
input something:
>> after input <<
asdf
Và, tất nhiên, giống hệt nhau xảy ra nếu tôi chỉ cần gọi một kịch bản:
test5:
./script.sh
Trong trường hợp nó giúp đốm vấn đề: OS X 10.10.3/thực hiện 3.81/bash 3.2.57 (1).
Tuyên bố từ chối trách nhiệm: Tôi biết không nên có phụ thuộc vào người dùng nhập vào Makefiles, nhưng tôi cần điều này cho một trường hợp rất cụ thể.
Trước hết, bạn muốn hành vi này cho mỗi mục tiêu Makefile, tôi hiểu, không phải trên toàn cầu cho mỗi Makefile. –
Tôi đã thử chạy test1 trên mac của mình, có phiên bản giống hệt của các ứng dụng đã sử dụng. Kết quả tôi nhận được là: 'bash-3.2 $ make test1 >> trước khi đầu vào << loại một cái gì đó: kiểm tra >> sau khi nhập << TESTING' Dẫn tôi tin rằng chúng tôi cần thêm thông tin để giải quyết vấn đề. Bạn có thực hiện bất kỳ thay đổi nào về cách bash hoặc thực hiện hành vi không? – Ashlaban
Tôi nghĩ bạn đang lên một cái gì đó ở đây, @Ashlaban. Nhận xét '.zshrc' của tôi làm cho đọc hoạt động như mong đợi trong mọi trường hợp. Tôi sẽ điều tra những gì tôi có trong đó đang gây ra vấn đề kỳ lạ này. – OmeGak