Làm cách nào tôi có thể trả lời lời nhắc trong tập lệnh shell chạy trong nền?


8

Tôi đang kịch bản cài đặt phần mềm trên máy chủ HP-UX. Khi tập lệnh bắt đầu, nó cung cấp một dấu nhắc nơi tôi đang nhập đường dẫn cài đặt. Tôi cần chuyển đường dẫn đến tập lệnh để nó có thể tiếp tục chạy. Chỉ có 1 vị trí trong kịch bản mà nhu cầu này tồn tại.

Lời nhắc từ tập lệnh là: Nhấn ENTER cho đường dẫn mặc định hoặc nhập đường dẫn để cài đặt phần mềm:

Tôi không muốn sử dụng đường dẫn mặc định, vì vậy tôi phải nhập một đường dẫn mới. Nhưng kịch bản này sẽ chạy trong nền và tôi cần cung cấp đường dẫn. Tôi không chắc về phản hồi chính xác ở dạng tập lệnh.


Xin vui lòng bạn có thể rõ ràng hơn về "kịch bản" là gì? Đây có phải là trình cài đặt mà bạn không thể chỉnh sửa vì một số lý do? Hoặc một đoạn script khác mà bạn đang viết để chạy trình cài đặt? Làm thế nào bạn bắt đầu trình cài đặt, để nó chạy trong nền?
JigglyNaga

Hãy xem câu trả lời của tôi, và kiểm tra nó!
Jay jargot

Câu trả lời:


4

Bạn có thể lặp lại câu trả lời của bạn vào đầu vào tiêu chuẩn của tập lệnh bằng cách sử dụng một đường ống.

echo "My/Path/not/default"| yourscript.sh

Vì vậy, trong cùng một tập lệnh, sau lệnh chạy trình cài đặt ... ./INSTALL im lặng ... Tôi nên chèn dòng sau ... echo "my / path / not / default /" | installscript.sh?
37Scheper

3

Nếu bạn có thể cung cấp tất cả các đầu vào khi tập lệnh bắt đầu, thì hãy làm như vậy, bằng cách chuyển hướng đầu vào của chương trình. Đó là, thay vì chạy /path/to/installer, chạy

{ echo '/the/path/where/to/install';
  echo 'answer to the second prompt';
} | /path/to/installer

hoặc sử dụng tài liệu ở đây :

/path/to/installer <<'EOF'
/the/path/where/to/install
answer to the second prompt
EOF

Thỉnh thoảng, nếu bạn muốn tương tác với một chương trình nhưng sử dụng thiết bị đầu cuối của bạn cho những thứ khác ở giữa, hãy chạy chương trình trong bộ ghép kênh đầu cuối như Màn hình hoặc tmux . Với màn hình, bắt đầu một phiên bằng cách chạy screen, sau đó bắt đầu chương trình. Để làm một cái gì đó khác, nhấn Ctrl+ A, cđể tạo cửa sổ thứ hai, sau đó Ctrl+ A, nđể điều hướng giữa các cửa sổ. Để thoát khỏi Màn hình nhưng để chương trình chạy, hãy nhấn Ctrl+ A, d(Xóa tách ra). Để quay lại phiên Màn hình hiện tại, hãy chạy screen -rd( screenkhông có tùy chọn nào sẽ bắt đầu phiên mới).


0

Để cung cấp câu trả lời tự động, bạn có thể sử dụng một trong các cách sau:

insaller.sh < an_input_file

hoặc là

command-line | installer.sh

Có một điều cần chú ý nếu installer.shtập lệnh đang sử dụng read -p, như trong ví dụ dưới đây:

read -p "Press ENTER for default path or enter path to install software:" answer

man bash xác định rằng không có gì được in nếu đầu vào tiêu chuẩn không phải là thiết bị đầu cuối.

Nếu đây là tình huống của bạn, thì bạn có thể thử điều kỳ lạ này:

( sleep 30 ; printf "/my/own/path\n" ) | insaller.sh

Bạn nên điều chỉnh số giây ( 30trong ví dụ trên) với tình huống của bạn.

Nếu nó xảy ra read -p không được sử dụng trong tập lệnh cài đặt, thì bạn có thể thử GNUgiải pháp này :

 tempdir="$(mktemp -d)"
 mkfifo  "${tempdir}"/input
 touch "${tempdir}"/output.log
 ./installer.sh <"${tempdir}"/input >"${tempdir}"/output.log 2>&1 &
 installerpid=$!
 tail --pid=$installerpid -fn 1 "${tempdir}"/output.log | ( fgrep -q "Press ENTER for default path or enter path to install software:"; printf "/new/path\n" ) >> "${tempdir}"/input &

 # ... do stuff


 # before ending the script, just wait that all background processes stop
 wait
 rm -f "${tempdir}"/input "${tempdir}"/output.log

Ý tưởng là sử dụng 2 dòng lệnh nền, một cho kịch bản cài đặt và một để chờ lời nhắc và cung cấp câu trả lời.

Một ống có tên ( input) và một tệp thông thường ( output.log) được sử dụng để liên lạc.

tail --pid=$installerpid -fn 1 "${tempdir}"/output.login các dòng như được viết trong output.logtập tin. Nó tạm thời khi tập lệnh cài đặt kết thúc.

( fgrep -q ... ; printf .. ) >> ...input: chặn cho đến khi tìm thấy dấu nhắc và cung cấp đường dẫn mới tới tập lệnh cài đặt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.