[-T 1] kiểm tra cái gì?


Câu trả lời:


14

[]là phím tắt của testlệnh.

Theo man test:

-t FD
Đúng nếu FD là một mô tả tập tin được liên kết với một thiết bị đầu cuối.

Vì vậy, nếu bạn chạy bash dưới dạng shell tương tác (thiết bị đầu cuối - xem chủ đề này để giải thích thuật ngữ), bash sẽ được thay thế bằng zsh.

Tìm hiểu thêm về các tệp .bash *:

Khi bash được gọi dưới dạng shell đăng nhập tương tác hoặc dưới dạng shell không tương tác với tùy chọn --login , đầu tiên nó sẽ đọc và thực thi các lệnh từ tệp / etc / profile, nếu tệp đó tồn tại. Sau khi đọc tệp đó, nó sẽ tìm ~ / .bash_profile, ~ / .bash_login và ~ / .profile, theo thứ tự đó, đọc và thực thi các lệnh từ lệnh đầu tiên tồn tại và có thể đọc được. Tùy chọn --noprofile có thể được sử dụng khi trình bao bắt đầu ngăn chặn hành vi này.

Khi shell đăng nhập thoát , bash đọc và thực thi các lệnh từ các tệp ~ / .bash_logout và /etc/bash.bash_logout, nếu các tệp tồn tại.

Khi một vỏ tương tác không phải là vỏ đăng nhập được khởi động, bash sẽ đọc và thực thi các lệnh từ ~ / .bashrc , nếu tệp đó tồn tại. Điều này có thể bị ức chế bằng cách sử dụng tùy chọn --norc. Tùy chọn tệp --rcfile sẽ buộc bash đọc và thực thi các lệnh từ tệp thay vì ~ / .bashrc.

Nhận xét của Stéphane Chazelas:
Lưu ý rằng hệ vỏ có thể tương tác mà không có thiết bị đầu cuối là thiết bị đầu cuối và hệ vỏ có thể không tương tác với thiết bị đầu cuối trên thiết bị xuất chuẩn (như bất cứ khi nào bạn chạy tập lệnh trong thiết bị đầu cuối mà không chuyển hướng / đường ống đầu ra của nó) và bashcó thể đọc .bashrcngay cả khi không tương tác (như trong ssh host cmdnơi bashlà vỏ đăng nhập của người dùng trên máy chủ, hoặc bash --login -c 'some code'). case $- in *i*)...là cách chính xác để kiểm tra nếu một vỏ có tương tác.


4
Lưu ý rằng shell có thể tương tác mà không có thiết bị đầu cuối là thiết bị đầu cuối và hệ vỏ có thể không tương tác với thiết bị đầu cuối trên thiết bị xuất chuẩn (như bất cứ khi nào bạn chạy tập lệnh trong thiết bị đầu cuối mà không chuyển hướng / đường ống đầu ra của nó) và bashcó thể đọc .bashrcngay cả khi không tương tác (như trong ssh host cmdđó bashlà vỏ đăng nhập của người dùng trên máy chủ hoặc bash --login -c 'some code'nơi các .bash_profilenguồn .bashrc). case $- in *i*)...là cách chính xác để kiểm tra nếu một vỏ có tương tác.
Stéphane Chazelas

@ StéphaneChazelas điểm tốt. Tôi sẽ chứa bình luận của bạn trong câu trả lời
mrc02_kr

Có một số định nghĩa khác nhau về "tương tác". Nếu shell nghĩ rằng nó là tương tác, thì isẽ được thiết lập (và trong các shell hiện đại có thể được thử nghiệm ifthay vì phải sử dụng case). Nhưng có nhiều trường hợp sử dụng trong đó người ta chỉ quan tâm nếu thiết bị xuất chuẩn (hoặc stdin, hoặc stderr ...) được gắn vào một thiết bị đầu cuối.
Mark Reed

9

Các lệnh kiểm tra [ -t 1 ] kiểm tra xem sản lượng bash là trên một thiết bị đầu cuối. Mục đích của dòng này rõ ràng là chạy zsh khi mở một thiết bị đầu cuối, mà không làm gián đoạn việc sử dụng bash khác. Nhưng nó được thực hiện rất tệ.

Các tập tin .bashrcđược đọc trong ba trường hợp:

  • Khi bash được thực thi như một shell tương tác, tức là để chạy các lệnh được người dùng gõ chứ không phải để thực thi các lệnh bó.
  • Khi bash là một vỏ không tương tác được chạy bởi một daemon RSH hoặc SSH (thường là do bạn chạy ssh host.example.com somecommandvà bash là vỏ đăng nhập của bạn trên host.example.com).
  • Khi nó được gọi một cách rõ ràng, ví dụ như trong người dùng .bash_profile( lựa chọn tệp khởi động của bash hơi lạ ).

[ -t 1 ]là một cách kém để phát hiện vỏ tương tác. Có thể, nhưng hiếm, để chạy bash tương tác với đầu ra tiêu chuẩn không đi đến một thiết bị đầu cuối. Nó phổ biến hơn khi có đầu ra tiêu chuẩn đi đến một thiết bị đầu cuối trong một vỏ không tương tác; một shell không tương tác không có hoạt động kinh doanh .bashrcnhưng không may là shell bash được gọi bởi SSH. Có một cách tốt hơn nhiều: bash (và bất kỳ shell sh-style nào khác) cung cấp một phương thức tích hợp, đáng tin cậy để thực hiện.

case $- in
  *i*) echo this shell is interactive;;
  *) echo this shell is not interactive;;
esac

Vì vậy, hãy khởi động zsh nếu đây là một shell tương tác nên được viết

case $- in
  *i*) exec zsh;;
esac

Nhưng ngay cả đó không phải là một ý tưởng tốt: nó ngăn mở bash shell, điều này hữu ích ngay cả khi bạn sử dụng zsh. Hãy quên bài đăng trên blog này đi và thay vào đó chỉ cần cấu hình lối tắt của bạn để mở một thiết bị đầu cuối để chạy zsh thay vì bash. Đừng sắp xếp mọi thứ sao cho bất cứ khi nào bạn mở ứng dụng Bash trên Windows, giờ đây nó sẽ khởi động với shell Zsh: khi bạn muốn zsh, hãy mở ứng dụng Zsh.


Đối với rsh/ sshvà cho vỏ tương tác, nếu nó không phải là vỏ đăng nhập. Đối với shell đăng nhập ( sshdsẽ không bắt đầu shell đăng nhập không tương tác, nhưng bạn có thể làm điều đó với ssh host exec bash -l), .bash_profileđược đọc thay thế. Cũng lưu ý rằng đối với rsh/ ssh, bạn cũng cần $SHLVLđược bỏ đặt hoặc 0.
Stéphane Chazelas

5

người đàn ông 1 bài kiểm tra :

-t FD

mô tả tập tin FD được mở trên một thiết bị đầu cuối

Ví dụ của bạn thực thi (thay thế quá trình đang chạy, trong trường hợp này bash) bằng zshbật nếu thiết bị xuất chuẩn được mở trên thiết bị đầu cuối (không phải là tệp / ống / vv).

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.