2015-06-07 13 views
6

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ể.

+0

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. –

+1

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

+0

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

Trả lời

0

Vì dường như không ai có thể tái tạo vấn đề của tôi, tôi đã hình dung rằng tôi phải có điều gì đó đang diễn ra trên môi trường của mình. Cuối cùng tôi đã tìm ra nguyên nhân đang ẩn náu ở đâu đó trên đống chỉnh sửa của tôi trong vòng .zshrc.

Dòng vi phạm hóa ra là một bí danh make để thêm cách tô màu với grc bằng cách nào đó thay đổi hành vi của read dưới dạng tác dụng phụ.

alias make='grc make' 

Loại bỏ nó giải quyết tất cả các vấn đề, nhưng, cuối cùng, giải pháp của tôi là để giữ bí danh cho colorization trong trường hợp bình thường và đơn giản gọi command make khi người dùng nhập vào là bắt buộc.

+1

Cách để bỏ qua bí danh là' lệnh make' hoặc '\ make'. Không có hành vi phạm tội, nhưng '/ usr/bin/env make' chỉ là vô lý. – 4ae1e1

0

Đối test 3 bạn có thể sử dụng echo -n để in thông điệp của bạn trên cùng một dòng mà không có sự trailing \n

+0

Dường như không hoạt động. Nó in: '-n đầu vào một cái gì đó:' – OmeGak

+0

Thêm '-n' vào' echo' hoạt động tốt cho tôi trong 'test3' –

0

Trong ví dụ của bạn, bạn đang chạy cơ bản là một lệnh shell duy nhất. Có thể chạy một loạt lệnh và tôi nghĩ đó là những gì bạn muốn ở đây. Ví dụ, hãy thử điều này. Đặt vào Makefile của bạn:

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

Lưu ý rằng thiếu dấu chấm phẩy và dấu gạch chéo ngược trên @echo đầu tiên.

Các vấn đề liên quan