2012-04-05 31 views
11

Tôi muốn vỏ của mình phát hiện nếu hành vi của con người, sau đó hiển thị lời nhắc.kiểm tra đẳng cấp trong bash

Vì vậy, giả sử tên tập tin là test.bash

#!/bin/bash 
if [ "x" != "${PS1:-x}" ] ;then 
read -p "remove test.log Yes/No" x 
[ "$x" = "n" ] && exit 1 
fi 
rm -f test.log 

Nhưng, tôi thấy nó không thể làm việc nếu tôi đã không được thiết lập PS1. Có phương pháp tốt hơn không?

phương pháp thử nghiệm của tôi:

./test.bash     # human interactive 
./test.bash > /tmp/test.log # stdout in batch mode 
ls | ./test.bash    # stdin in batch mode 

Trả lời

28

để xây dựng, tôi sẽ cố gắng

if [ -t 0 ] ; then 
    # this shell has a std-input, so we're not in batch mode 
    ..... 
else 
    # we're in batch mode 

    .... 
fi 

Tôi hy vọng điều này sẽ giúp.

+3

Mẫu của bạn phù hợp với trường hợp ** stdin **, đối với ** stdout **, chúng tôi có thể sử dụng 'if [-t 1]'. –

+1

để có câu trả lời hay nhất là 'if [-t 0] && [-t 1]' –

+0

Cảm ơn bạn đã chia sẻ. Điều này có vẻ như là một ý tưởng hay. Thỉnh thoảng ít hơn, đôi khi ít hơn là ít hơn. Vậy ... Đây có phải là một mô hình mới trong kịch bản vỏ mà tôi không biết hoặc ý kiến ​​cá nhân của bạn? Chúc mọi người may mắn. – shellter

7

Từ help test:

-t FD   True if FD is opened on a terminal. 
+0

cảm ơn, câu trả lời của bạn là chính xác, nhưng câu trả lời tiếp theo là rõ ràng hơn. –

5

Bạn có thể tận dụng các chương trình /usr/bin/tty:

if tty -s 
then 
    # ... 
fi 

Tôi thừa nhận rằng tôi không chắc nó di động như thế nào, nhưng nó ít nhất là một phần của các lõi của GNU.

+0

Theo [this] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/tty.html), 'tty' có thể không hỗ trợ tùy chọn' -s'. Vì vậy, hoặc sử dụng '[-t N]', hoặc chuyển hướng đầu ra sang '/ dev/null'. –

+0

Và nếu bạn muốn kiểm tra stdout, không phải stdin, làm 'tty

2

Lưu ý rằng nó không phải là cần thiết để sử dụng &&|| khai thác vỏ lực lưỡng để kết hợp hai chạy riêng biệt của lệnh [, bởi vì lệnh [ có riêng built-in -ahoặc-o hoạt động của nó mà cho phép bạn soạn một số bài kiểm tra đơn giản hơn thành một kết quả duy nhất.

Vì vậy, đây là cách bạn có thể thực hiện các thử nghiệm mà bạn yêu cầu - nơi bạn lật vào chế độ hàng loạt nếu hoặc đầu vào hoặc đầu ra đã được chuyển ra khỏi TTY - sử dụng một gọi duy nhất của [ :

if [ -t 0 -a -t 1 ] 
then 
    echo Interactive mode 
else 
    echo Batch mode 
fi 
+0

Shellcheck cho biết '[a] && [b]' có thể di động hơn '[a -ab]', mặc dù . – bacondropped

+0

(Nếu bạn quan tâm đến chi tiết cụ thể, đây là thông báo cho biết: 'SC2166: Ưu tiên [p] && [q] vì [p -a q] không được xác định rõ.') – bacondropped

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