Câu hỏi Làm thế nào để kiểm tra vỏ nào tôi đang sử dụng?


Tôi đọc thiết bị đầu cuối đó không là gì ngoài shell, và Unix cung cấp các hương vị khác nhau của shell:

  • Vỏ Bourne (sh)
  • Vỏ C (csh)
  • Vỏ TC (tcsh)
  • Vỏ Korn (ksh)
  • Bourne Again shell (bash)

Câu hỏi:

  • Khi tôi mở một cửa sổ đầu cuối, vỏ nào được mở theo mặc định?
  • Làm thế nào để kiểm tra xem có bao nhiêu shell được cài đặt?
  • Làm cách nào để thay đổi hệ vỏ được sử dụng từ tài khoản của tôi?

236
2018-02-28 03:58


gốc


Làm thế nào để xác định vỏ hiện tại tôi đang làm việc trên? trên stackoverflow.com - αғsнιη
@KasiyA Điều này cũng liên quan đến askubuntu.com/questions/87853/… - d a i s y


Các câu trả lời:


Bạn có thể gõ lệnh sau trong terminal của bạn để xem bạn đang sử dụng shell nào:

echo $0

Kết quả sẽ trông giống như dưới đây nếu bạn đang sử dụng bash (Bourne Again Shell) thiết bị đầu cuối:

-bash

288
2018-02-28 04:03



Là 0 biến môi trường? - Mi_Onim
@Mi_Onim $ 0 là tên của tiến trình đang chạy. Nếu bạn sử dụng nó bên trong một shell thì nó sẽ trả về tên của shell. Nếu bạn sử dụng nó bên trong một kịch bản, nó sẽ là tên của kịch bản. - kingmilo
CHÚ THÍCH: điều này sẽ không hoạt động cho tương tác csh. % echo $0 No file for $0. nhưng nó hoạt động tcsh - Sergiy Kolodyazhnyy
Không hoạt động nếu khi một là symlink. Như bash như sh - Anwar
@Anwar làm cho một điểm tốt, sau khi bạn nhận được tên vỏ từ echo $0, ls -l `which <name>`  để xem liệu nó có được liên kết với một hệ vỏ nhị phân khác không. - JivanAmara


Để tìm shell bạn có trên môi trường mặc định, bạn có thể kiểm tra giá trị của SHELL biến môi trường:

echo $SHELL

Để tìm cá thể shell hiện tại, tìm quá trình (shell) có PID của thể hiện shell hiện tại.

Để tìm PID của thể hiện shell hiện tại:

echo "$$"

Bây giờ để tìm quá trình có PID:

ps -p <PID>

Đặt nó lại với nhau:

ps -p "$$"

76
2018-02-28 04:06



$ SHELL là lớp vỏ mặc định cho hệ thống (hoặc người dùng), thường là (nhưng không nhất thiết) là trình bao thực sự đang được sử dụng tại bất kỳ thời điểm nào. - kingmilo
@kingmilo: Đúng vậy, câu trả lời đã được sửa đổi. - heemayl
Tôi thấy điều này khá hữu ích khi chuyển sang người dùng thông qua 'su - <username>', ví dụ: để thiết lập postgres, jenkins, ... - bully
echo $SHELL đưa cho tôi /bin/csh và ps -p $$ đưa cho tôi 22673 pts/1 00:00:00 bash. Kingmilo giải thích (ở trên) tại sao họ không giống nhau. - 18446744073709551615
@ 18446744073709551615 Tôi chưa từng nói rằng chúng giống nhau. Vui lòng đọc lại câu trả lời một cách cẩn thận; lưu ý mặc định và hiện hành các từ. - heemayl


$SHELL cung cấp cho bạn trình bao mặc định. $0 cung cấp cho bạn trình bao hiện tại.

Ví dụ: Tôi có bash là shell mặc định của tôi, mà tôi sử dụng cho Terminal App của mình. Nhưng đối với ứng dụng iTerm2 của tôi, tôi sử dụng lệnh khi cửa sổ mở ra: /bin/ksh.

Vì vậy, tôi $0 đưa cho tôi /bin/ksh trên iTerm2. $SHELL đưa cho tôi /bin/bash trên iTerm2. $0,$SHELL đưa cho tôi /bin/bash trên Terminal


16
2017-11-18 11:45



Đây là một sự định hướng tốt đẹp của các câu trả lời được bình chọn hàng đầu khác. Cảm ơn bạn. - Michael Hoffmann


Để biết đó là trình bao mặc định cho người dùng của bạn, bạn có thể chạy:

echo "$SHELL"

Ví dụ nếu bạn đang sử dụng Bash, bạn sẽ nhận được kết quả sau:

/bin/bash

Nếu bạn không thay đổi bất kỳ cấu hình nào, nó sẽ là Bash vì Bash là trình bao mặc định trên Ubuntu.


5
2018-02-28 04:02



/ bin / sh là Shell Command Language và không phải là Bourne Shell, vui lòng chỉnh sửa câu trả lời của bạn. - kingmilo
@kingmilo Không có /bin/sh tham chiếu trong câu trả lời của tôi - kos
@kol đã có trước khi chỉnh sửa. Cũng xin lưu ý $ SHELL là trình bao mặc định cho hệ thống (hoặc người dùng), thường là (nhưng không nhất thiết) là trình bao thực sự đang được sử dụng tại bất kỳ thời điểm nào. - kingmilo
@kingmilo Xin lưu ý rằng câu hỏi là "khi tôi mở thiết bị đầu cuối mà vỏ được mở theo mặc định?" và câu trả lời là "Nếu bạn không thay đổi bất kỳ cấu hình nào Bash, bởi vì đó là trình bao mặc định trên Ubuntu ", vì vậy câu trả lời phù hợp với câu hỏi - kos
@kingmilo Đọc câu trả lời một lần nữa tôi nghĩ rằng tôi hiểu mối quan tâm của bạn là gì, có lẽ tôi đã không thể hiện bản thân mình tốt. Tôi đã làm rõ ý nghĩa của "hiện tại" trong câu trả lời của tôi - kos


Các câu trả lời khác có xu hướng sử dụng các tính năng cụ thể của trình bao, nhưng chúng tôi đang cố gắng khám phá xem chúng tôi đang sử dụng trình bao nào, vì vậy chúng giả định câu trả lời cho vấn đề. Ví dụ, không có câu trả lời nào sẽ hoạt động trên cá.

sh -c 'ps -p $$ -o ppid=' | xargs ps -o cmd= -p

Thay vào đó sử dụng cú pháp $$ trong lời gọi sh, nhưng sau đó chúng ta đang tìm kiếm PPID không phải là PID. Sử dụng PPID để tìm cmd.

sh -c 'ps -p $$ -o ppid=' | xargs -i readlink -f /proc/\{\}/exe

Cảm ơn bạn đã cải thiện @muru


2
2018-04-06 04:00



Bạn ca sử dụng ppid=/cmd=để bỏ qua các tiêu đề (và vì vậy tail -1và xem xét /proc/.../exe để xem tệp nào đang được chạy (vì cmd đầu ra có thể được điều khiển bởi bất cứ điều gì đã chạy shell). - muru
Rõ ràng điều này không hoạt động trong busybox, do không tuân thủ posix: ref: github.com/broadinstitute/cromwell/pull/… - Evan Benn