2009-06-03 10 views
5

Cách ưa thích để xác định xem một lời gọi ksh đã cho có đang chạy một trình bao tương tác không?Phát hiện trình bao tương tác bên trong tập lệnh ENV ksh

Tôi có một số lệnh trong tệp ENV mà tôi muốn bỏ qua cho các lời gọi ksh không tương tác (ví dụ: khi thực thi tập lệnh trình bao).

tôi đã nhìn thấy gợi ý khác nhau, from:

if [[ $- = *i* ]]; then 
    # do interactive stuff 
fi 

... thậm chí không tìm nguồn cung ứng .kshrc trừ khi vỏ được xác định là tương tác sử dụng này khó hiểu incantation:

ENVIRON=$HOME/.kshrc         export ENVIRON 
ENV='${ENVIRON[(_$-=1)+(_=0)-(_$-!=_${-%%*i*})]}'  export ENV 

Trả lời

2

Trong bash, hai phương pháp này thường được sử dụng bên trong ~/.bashrc:

  • Kiểm tra nếu stdin là một tty:

    [ -t 0 ] || return 
    

    hoặc

    if [ -t 0 ]; then 
        # do interactive stuff 
    fi 
    
  • Kiểm tra xem dấu nhắc ($PS1) được thiết lập:

    [ -z "$PS1" ] || return 
    

Nhưng tôi không biết phải làm sao trong ksh.

+0

Các thử nghiệm '-t N' cũng hoạt động trong Korn shell. –

+1

Có phải '-t N' dứt khoát không? Có những trường hợp khác với '$ - = * i *' không? –

+0

'test -t 0' là để kiểm tra, cho dù' stdin' là một thiết bị đầu cuối. Điều đó không giống như liệu shell có tương tác hay không. Bạn có thể chạy một shell-script, ví dụ, đọc từ tty. –

4

Tôi đã tìm thấy việc kiểm tra biến $ - cho cờ 'i' là phương pháp tốt nhất trong ksh.

if [[ $- = *i* ]]; then 
    #do interactive stuff  
fi 
0

của nó cũng có thể sử dụng 'tty -s':

The following exit values are returned: 

    0  Standard input is a terminal. 

    1  Standard input is not a terminal. 
0

Một KSH vỏ thích hợp không nên gọi $ ENV khi chạy một kịch bản. Tuy nhiên, đây là một lỗi hiện tại trong phương ngữ ksh88 của Sun, và thực sự được vá muộn trong Solaris 10. (Khá ngạc nhiên, như Sun thường rất miễn cưỡng thay đổi hành vi hiện tại, bởi vì các sửa lỗi như vậy có thể phá vỡ cách giải quyết. tiêu chuẩn chiếm ưu thế.)

Để tránh ksh88 của mặt trời đọc $ ENV khi chạy tập lệnh, việc sử dụng giải pháp #!/bin/ksh -p là an toàn và an toàn nếu bạn không có /etc/suid_profile treo xung quanh.

Tuy nhiên, $ - chỉ báo đáng tin cậy của trình bao tương tác, trừ khi bạn giả mạo nó.

$ cat interactive.sh 
echo \$- = $- 
[[ $- == *i* ]] && echo interactive || echo not interactive 

Khi chạy như một kịch bản này cho phép:

$ ksh interactive.sh 
$- = hB 
not interactive 

Khi chúng ta giả cờ -i, bạn sẽ có được những gì bạn yêu cầu:

$ ksh -i interactive.sh 
$- = imBE 
interactive 

Và khi có nguồn gốc từ một vỏ tương tác , nó sẽ làm điều đúng:

$ . ./interactive.sh 
$- = imsBEl 
interactive