Làm thế nào tôi có thể phát hiện ra một vỏ không đăng nhập? (Trong Zsh)


7

Tôi muốn tạo một tập lệnh chạy khi một cá thể Zsh bắt đầu, nhưng chỉ khi thể hiện đó là:

  • Không đăng nhập.
  • Tương tác

Tôi nghĩ rằng tôi đúng khi nói .zshrcchạy cho tất cả các trường hợp shell tương tác .zprofile.zloginchạy cho tất cả các shell đăng nhập và .zshenvchạy trong mọi trường hợp.

Lý do tôi muốn làm điều này là để kiểm tra xem có một ssh-agent nào đang chạy hay không và sử dụng nó trong shell mới mở nếu có.

Tôi tưởng tượng bất kỳ thử nghiệm nào được thực hiện sẽ được đặt tốt nhất .zshrc(vì điều này đảm bảo lớp vỏ tương tác) và tập lệnh "sự kiện không đăng nhập" được chỉ định từ đó.

Trước tiên tôi có thể muốn kiểm tra xem shell mới đã chạy như là một phần của phiên SSH từ xa hiện có trước khi thử nghiệm cho ssh-agent, nhưng tôi đã tìm thấy công thức SE này cho mục đích này.

Tôi chọn Zsh vì nó là shell tôi thích, nhưng tôi tưởng tượng bất kỳ kỹ thuật chính xác nào để làm điều này sẽ áp dụng tương tự với các shell khác.

Câu trả lời:


14
if [[ -o login ]]; then
  echo "I'm a login shell"
fi

if [[ -o interactive ]]; then
  echo "I'm interactive"
fi

[[ -o the-option ]] trả về true nếu tùy chọn được đặt.

Bạn cũng có thể nhận được các giá trị của các tùy chọn với $optionsmảng kết hợp đặc biệt hoặc bằng cách chạy set -o.

Để kiểm tra xem có đại lý ssh không:

if [[ -w $SSH_AUTH_SOCK ]]; then
  echo "there's one"
fi

Trong ksh(và zsh):

case $- in (*i*) echo interactive; esac
case $- in (*l*) echo login; esac

Trong bashđó, đó là một mớ hỗn độn, bạn cần:

case $- in *i*) echo interactive; esac # that should work in any Bourne/POSIX shell
case :$BASHOPTS: in (*:login_shell:*) echo login; esac

$SHELLOPTSchứa một số tùy chọn hơn. Một số tùy chọn bạn có thể thiết lập set -<x>, một số với set -o option, một số với shopt -s option.


Phải ... Tôi đã nhận thấy các -otùy chọn này nhưng tôi nghĩ rằng chúng là các tùy chọn được đặt có thể ghi đè mặc định nghĩa là buộc hành vi , thay vì truy vấn tình huống thực tế. Tôi có lầm không?
Geeb

@Geeb, [[ -o opt ]]kiểm tra nếu optđược đặt. Tôi không thể hiểu tại sao nó chỉ làm điều đó khi tùy chọn được đặt theo cách nào đó chứ không phải cách khác.
Stéphane Chazelas

Vì vậy, bạn đang nói truy vấn các giá trị tùy chọn luôn báo cáo sự thật của vấn đề? ví dụ: bạn không thể lừa một ví dụ shell, bắt đầu ở chế độ không tương tác, đọc .zshrcbằng cách đặt interactivetùy chọn?
Geeb

Các .zshrcđược đọc khi khởi động khi vỏ là tương tác. Nó có thể được đọc bởi ai đó làm source ~/.zshrc.
Stéphane Chazelas

OK một kiểu lừa dối khác: Đặt logintùy chọn vào .zshrcsẽ khiến tất cả các vỏ tương tác bắt đầu sau khi thay đổi này hoạt động như thể chúng là kết quả của một lần đăng nhập, phải không? tức là hành vi bị ép buộc - trong thực tế, chúng không thực sự đăng nhập shell và chỉ hành xử như vậy bởi vì chúng được bảo vệ như vậy bởi chính quyền của cài đặt tùy chọn?
Geeb
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.