Làm cách nào để kiểm tra vỏ tôi đang sử dụng?


357

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)
  • Vỏ Bourne Again (bash)

Câu hỏi:

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


@KasiyA Điều này cũng liên quan đến Askubfox.com/questions/87853/ trên
daisy

Xin lưu ý rằng thiết bị đầu cuối là giao diện với hệ vỏ (mà tại một thời điểm từng là giao diện thực tế) và hệ vỏ không phải là thiết bị đầu cuối - đó là trình thông dịch lệnh. Xem thêm Askubfox.com/a/640105/295286
Sergiy Kolodyazhnyy

Câu trả lời:


427

Bạn có thể nhập lệnh sau trong thiết bị đầu cuối 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ư bên dưới nếu bạn đang sử dụng thiết bị đầu cuối bash ( Bourne Again Shell ):

-bash

2
0một biến môi trường?
Mi_Onim

43
@Mi_Onim $ 0 là tên của quy trình đang chạy. Nếu bạn sử dụng nó bên trong một cái vỏ thì nó sẽ trả về tên của cái vỏ. Nếu bạn sử dụng nó bên trong một tập lệnh, nó sẽ là tên của tập lệnh.
kingmilo

2
LƯU Ý : điều này sẽ không hoạt động để tương tác csh. % echo $0 No file for $0., nhưng nó hoạt động chotcsh
Sergiy Kolodyazhnyy

2
Không hoạt động nếu một là symlink. Giống bashnhưsh
Anwar

9
@Anwar làm cho một điểm tốt, sau khi bạn nhận được tên shell từ echo $0, ls -l `which <name>` để xem nếu nó được liên kết với một nhị phân shell khác.
JivanAmara

121

Để 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 SHELLbiến môi trường:

echo $SHELL

Để tìm phiên bản shell hiện tại, hãy tìm tiến trình (shell) có PID của thể hiện shell hiện tại.

Để tìm PID của phiên bản hiện tại của shell:

echo "$$"

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

ps -p <PID>

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

ps -p "$$"

27
$ SHELL là hệ 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ớp vỏ thực sự đang được sử dụng tại bất kỳ thời điểm nào.
kingmilo

1
@kingmilo: Đúng rồi bạn, trả lời 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 - <tên người dùng>', ví dụ: để thiết lập postgres, jenkins, ...
bắt nạt

1
echo $SHELLđã cho tôi /bin/cshps -p $$cho tôi 22673 pts/1 00:00:00 bash. Kingmilo giải thích (ở trên) tại sao chúng không giống nhau.
18446744073709551615

@ 18446744073709551615 Tôi chưa nói họ giống nhau. Xin vui lòng đọc câu trả lời cẩn thận một lần nữa; lưu ý các từ mặc địnhhiện tại .
heemayl

25

$SHELLcung cấp cho bạn shell mặc định. $0cung cấp cho bạn vỏ hiện tại.

Ví dụ: Tôi có bash làm shell mặc định, mà tôi sử dụng cho Ứng dụng đầu cuối 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ở : /bin/ksh.

Vì vậy, tôi $0cho tôi /bin/kshtrên iTerm2. $SHELLcho tôi /bin/bashtrên iTerm2. $0, $SHELLđưa tôi /bin/bashvào Terminal


2
Đây là một đị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

Đối với tôi, tôi đã cài đặt zsh và đó là mặc định hiện tại, để thay đổi thành bash, tất cả những gì tôi phải làm bashtrong thiết bị đầu cuối. Để chuyển về zsh, hãy nhậpzsh
Yousuf Azad

8

Để biết lớp vỏ mặc định nào 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ả đầu ra sau:

/bin/bash

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


/ bin / sh là Ngôn ngữ lệnh Shell chứ không phải Bourne Shell, vui lòng chỉnh sửa câu trả lời của bạn.
kingmilo

@kingmilo Không có /bin/shtài liệu tham khảo 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à hệ 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ớp vỏ thực sự đang được sử dụng tại bất kỳ thời điểm nào.
kingmilo

1
@kingmilo Đọc lại câu trả lời tôi nghĩ 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 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

1
@frederickjh cá là một chút kỳ lạ ở đây. Các $$biến được thực sự được định nghĩa bởi POSIX và sẽ làm việc trên phần lớn các vỏ. Cá đã quyết định không tuân theo tiêu chuẩn ở đây nên tôi nghĩ thật công bằng khi bỏ qua nó. Tôi có thể xác nhận rằng $$hoạt động như mong đợi trong sh, dash, bash, zsh, ksh, ash, tcsh và csh. Trên thực tế, ngoài đỉnh đầu tôi không thể nghĩ ra bất kỳ chiếc vỏ nào khác ngoại trừ cá nơi nó không hoạt động.
terdon

8

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 shell, nhưng chúng tôi đang cố gắng khám phá xem chúng tôi đang sử dụng shell nào, vì vậy chúng giả sử câu trả lời cho vấn đề. Ví dụ, không có câu trả lời nào có tác dụng với cá.

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

Thay vào đó, hãy sử dụng cú pháp $$ trong một lời gọi của sh, nhưng sau đó chúng tôi đang tìm PPID chứ 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 đã cải thiện @muru


2
Bạn sử dụng ppid=/ cmd=để bỏ qua các tiêu đề (và vì vậy tail -1s), và xem xét xem /proc/.../exeđể xem tập tin nào đang được chạy (vì cmdđầu ra có thể bị thao túng bởi bất cứ thứ gì chạy shell).
muru

1
Rõ ràng điều này không hoạt động trong busybox, do không tuân thủ posix: ref: github.com/broadinstolarship/cromwell/pull/ mẹo
Evan Benn

4

Bài gốc hỏi ba câu. Các câu trả lời được đưa ra bao gồm câu hỏi đầu tiên, "Khi tôi mở một cửa sổ đầu cuối, lớp vỏ nào được mở theo mặc định?" Họ cũng trả lời một câu hỏi KHÔNG được hỏi, đó là "Làm thế nào tôi có thể tìm ra cái vỏ nào hiện đang chạy trong thiết bị đầu cuối?" Tuy nhiên, theo như tôi có thể thấy không ai trả lời được câu hỏi thứ hai hoặc thứ ba ban đầu, cụ thể là "Làm cách nào để kiểm tra có bao nhiêu vỏ được cài đặt?" và "Làm cách nào để thay đổi vỏ được sử dụng từ tài khoản của tôi?"

  • Để trả lời "Làm thế nào để tôi kiểm tra có bao nhiêu vỏ được cài đặt?" lệnh sau sẽ liệt kê tất cả các shell có sẵn:

mèo / etc / vỏ

Ví dụ: trên bản cài đặt mặc định của Ubuntu 18.10, điều này mang lại:

# / etc / shells: shell đăng nhập hợp lệ

/ thùng / sh

/ bin / dấu gạch ngang

/ thùng / bash

/ thùng / rash

Tuy nhiên, theo mặc định sh là một liên kết tượng trưng cho dấu gạch ngang, trong khi rbash liên kết đến bash với tùy chọn -r ("bash bị hạn chế") nên thực tế chỉ có hai shell chứ không phải bốn như danh sách trên cho thấy. Lệnh sau sẽ cho bạn biết liệu có bất kỳ shell nào được liệt kê trong thực tế là các liên kết tượng trưng hay không và nếu có thì chúng liên kết đến: ls -l / bin

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.