2013-05-04 24 views
15

Chúng tôi có thể chạy một cái gì đó như chsh -s /usr/local/bin/zsh để đặt vỏ mặc định mới. Có một lệnh chúng ta có thể chạy để biết vỏ đó là gì không?Cách lấy vỏ mặc định

Tôi không có nghĩa là có một thiết bị đầu cuối đang mở và đang chạy lệnh để biết chúng tôi đang ở trong trường hợp nào, ví dụ như trong ví dụ trên, nếu tôi đang mở một thiết bị đầu cuối với số /bin/bash. nhận được /usr/local/bin/zsh nếu đó là vỏ mặc định hiện tại?

+1

thể trùng lặp của [Làm thế nào để xác định vỏ hiện tại tôi đang làm việc trên?] (http: // stackoverflow. com/questions/3327013/how-to-defined-the-current-shell-im-working-on) – TheHippo

+0

Ngoài ra, hãy nhớ rằng existenc e của http://unix.stackexchange.com/ :) –

+1

Không, đó là về shell * current * chứ không phải shell * default * của người dùng. – zwol

Trả lời

27

bạn có thể sử dụng lệnh sau echo $SHELL

+2

Hãy nhớ rằng 'SHELL' có thể không được thiết lập bởi tất cả các trình bao, và không có đảm bảo rằng tất cả các shell sử dụng cùng một quy tắc để thiết lập giá trị của nó. – chepner

+3

@chepner Biến SHELL là một tiêu chuẩn. Nó không được thiết lập bởi chính shell nhưng trước khi shell được khởi chạy bởi quá trình đăng nhập. – jlliagre

+1

@jilliagre: Tôi đang tìm kiếm trong phần Shells & Utilities của tiêu chuẩn, không phải là Định nghĩa cơ sở. 'SHELL' thực sự được định nghĩa trong phần 8.3 của các biến [Biến môi trường] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html) của Định nghĩa cơ sở. – chepner

1

nếu bạn muốn lấy vỏ mặc định của người dùng, bạn có thể grep số /etc/passwd. như:

kent$ grep "$USER" /etc/passwd 
kent:x:1000:1000::/home/kent:/bin/zsh 

nói với tôi rằng người dùng hiện tại (kent) có vỏ mặc định /bin/zsh

nếu bạn chỉ muốn nắm bắt những phần vỏ:

kent$  awk -F: -v u="$USER" 'u==$1&&$0=$NF' /etc/passwd 
/bin/zsh 

Nếu bạn muốn để có được những mặc định vỏ của người dùng khác, chỉ cần thay thế phần $ USER.

+0

tại sao tất cả công việc khó khăn? chỉ cần thực hiện 'echo $ SHELL' – Bill

+0

yes $ SHELL là phím tắt cho người dùng hiện tại. – Kent

+1

Dường như không hoạt động trên OSX. – user137369

2

Bạn có thể grep trong file/etc/passwd cho tên người dùng hiện tại, và sử dụng cắt để trích xuất các cột thích hợp của thông tin:

grep ^$(id -un): /etc/passwd | cut -d : -f 7- 

$(id -un) là một an toàn hơn $USER để lấy tên người dùng. Sử dụng ^ trước tên người dùng và : sau khi đảm bảo bạn không nhận được kết quả trùng khớp nếu tên người dùng của bạn là phần phụ của tên người dùng khác.

$SHELL cũng có thể được sử dụng, như được đề xuất. Tuy nhiên nó sẽ không hoạt động nếu chsh được sử dụng trong trình bao hiện tại, vì biến không được cập nhật. Ngoài ra các biến không được bảo vệ chống lại bị thay đổi, vì vậy nó về mặt lý thuyết có thể được thiết lập để một cái gì đó hoàn toàn khác nhau.

Cập nhật để thử giải pháp tương thích OS X. Có lẽ không phải là regexp tối ưu:

grep ^.*:.*:$(id -u): /etc/passwd | cut -d : -f 7- 

Điều này được dựa trên id người dùng. Nếu toàn bộ mục nhập người dùng bị thiếu, không chỉ tên người dùng, thì osx phải lưu trữ mục này ở một nơi khác.

+0

Dường như không hoạt động trên OSX. – user137369

+0

Phần nào không hoạt động trên OSX? Truy cập/etc/passwd để lấy shell mặc định, hoặc những thứ xung quanh để trích xuất tên người dùng và phần mong muốn của thông tin? – Atle

+0

Vì một số lý do, tên tài khoản người dùng của tôi không có trong '/ etc/passwd'. – user137369

-1

Trong OS X, sử dụng lệnh env | grep -i 'SHELL' tạo ra một sản lượng như: SHELL=/bin/sh (như là người chủ, người sử dụng tuy nhiên thường xuyên có xu hướng có/bin/bash như vỏ mặc định) với một phân tích nhỏ, con đường vỏ (và do đó vỏ thân) có thể dễ dàng xác định và trích xuất từ ​​đó ..

4

cho MacOS

dscl . -read /Users/username UserShell 
+0

Tôi đang sử dụng hệ điều hành MacOS. Mặc dù mã của bạn cũng hoạt động, 'echo $ SHELL' là cấp trên theo mọi cách. Chạy nhanh hơn, cần ít CPU hơn, ngắn hơn và linh hoạt hơn. – user137369

+2

@ user137369 Nếu bạn gọi 'chsh' từ bên trong trình bao, nó không thể cập nhật' $ SHELL'. Vì vậy, 'echo $ SHELL' báo cáo giá trị cũ, bây giờ không chính xác, nhưng' dscl. -read/Users/$ USER UserShell' báo cáo giá trị mới. –

Các vấn đề liên quan