Tìm ra shell mặc định của người dùng trong tập lệnh shell


10

Tôi đã tự hỏi nếu có một cách để tìm ra shell mặc định của người dùng hiện tại trong một tập lệnh shell?

Ca sử dụng: Tôi đang làm việc trên một tập lệnh đặt bí danh cho một lệnh và bí danh này được đặt trong tập lệnh shell.

!# /bin/bash
alias = 'some command to set the alias'

Có một logic trong tập lệnh nơi nó cố gắng tìm shell mặc định của người dùng thực thi tập lệnh và thêm bí danh này vào tệp ~ / .bashrc hoặc ~ / .zshrc tương ứng

Nhưng khi tôi thêm một shebang vào trước tập lệnh và yêu cầu rõ ràng nó sử dụng bash, các câu trả lời được đăng ở đây luôn trả về bash như mong đợi mặc dù tôi đang thực thi tập lệnh này trên thiết bị đầu cuối ZSH.

Có cách nào để có được kiểu shell trong đó tập lệnh được thực thi bất kể tập shebang không?

Tôi đang tìm kiếm một giải pháp hoạt động trên cả Mac và tất cả các bistro dựa trên linux.


@StephenRauch Tôi nên đề cập đến nó sớm hơn, tôi đang tìm kiếm một phương pháp hoạt động trên cả hệ thống dựa trên Mac và Linux. / etc / passwd trên Mac không chứa thông tin người dùng và nó chỉ được tư vấn trong một chế độ người dùng.
Người Tây Ban

Những gì hiện /etc/passwdcó trên OSX? Tôi đã có một cái nhìn nhanh trên mạng và có vẻ như cái vỏ ở đó, không phải tên người dùng. ID người dùng vẫn còn đó, tại sao bạn không sử dụng?
terdon

Tôi tự hỏi nếu nó thậm chí có thể có một danh sách đầy đủ các đạn pháo. Hoặc làm tất cả các tệp khởi động shell luôn tuân thủ. {Name_of_shell} rc?
jamesqf

Câu trả lời:


6
$ finger $USER|grep -oP 'Shell: \K.*'
/bin/mksh

Cảm ơn nó hoạt động như một nét duyên dáng! Đây là giải pháp duy nhất có thể hoạt động cho cả bistro dựa trên mac và linux.
Người Tây Ban

1
BTW, tôi đã chỉnh sửa lệnh một chút để làm cho nó không phù hợp với tất cả các hệ điều hành finger $USER | grep 'Shell:*' | cut -f3 -d ":"vì các tùy chọn grep -P không được hỗ trợ trên Mac.
Người Tây Ban

2
Lưu ý rằng fingercó thể không được cài đặt trên tất cả các máy. Đây là gói tùy chọn trên các hệ thống dựa trên RedHat.
Stephen Harris

1
@Kishorepandey: bạn có thể sử dụng getent|grep ^$USER:|cut -f: -f7thay vì ngón tay, nếu ngón tay không được cài đặt theo mặc định.
Ipor Sircer

@Kishorepandey Đừng làm điều này. Sử dụng SHELLbiến môi trường nếu có. Nhìn vào cơ sở dữ liệu người dùng sẽ cho bạn một kết quả (vỏ đăng nhập của người dùng) nhưng nó có thể không phải là kết quả đúng (vỏ tương tác yêu thích của người dùng) - nó phụ thuộc vào cấu hình của người dùng.
Gilles 'SO- ngừng trở thành ác quỷ'

18

Biến môi trường, SHELLsẽ luôn mở rộng tới vỏ đăng nhập mặc định của người dùng gọi (nhận giá trị từ /etc/passwd).

Đối với bất kỳ người dùng cụ thể nào khác, bạn cần thực hiện một số xử lý với /etc/passwd, đây là một awkđoạn đơn giản :

awk -F: -v user="foobar" '$1 == user {print $NF}' /etc/passwd

Thay thế foobarbằng tên người dùng thực tế.

Nếu bạn có ldap(hoặc một cái gì đó tương tự tại chỗ), hãy sử dụng getentđể lấy cơ sở dữ liệu thay vì phân tích cú pháp trực tiếp /etc/passwd:

getent passwd | awk -F: -v user="foobar" '$1 == user {print $NF}'

hoặc cách tiếp cận sạch nhất, hãy getentthực hiện phân tích cú pháp (nhờ @Kusalananda):

getent passwd foobar | awk -F: '{print $NF}'

3
getent passwd foobarđể bỏ qua phải phù hợp với một dòng cụ thể.
Kusalananda

Cảm ơn câu trả lời. Tôi nên đã đề cập đến nó sớm hơn, tôi đang tìm kiếm một phương pháp hoạt động trên cả hệ thống dựa trên Mac và Linux. / etc / passwd trên Mac không chứa thông tin người dùng và nó chỉ được tư vấn trong một chế độ người dùng.
Người Tây Ban

4

getentkhông phải là một lệnh tiêu chuẩn trên MacOS, bạn có thể muốn sử dụng một getpwuidcuộc gọi cấp thấp hơn sẽ tham khảo các dịch vụ đặt tên mà máy được cấu hình. Điều này có thể yêu cầu gọi ra perlhoặc python, khá phổ biến trên hầu hết các nền tảng giống Unix

ví dụ: điều này sẽ trả lại shell cho người dùng hiện tại:

perl -e '@x=getpwuid($<); print $x[8]'

2

Bạn có thể lấy shell mặc định của người dùng từ môi trường như thế này:

echo $SHELL

Nhưng không như thế này:

echo $0

Cái sau sẽ chỉ cho bạn biết shell nào mà script của bạn hiện đang sử dụng. Vì vậy, bạn muốn tùy chọn đầu tiên ở trên.



0

Có lẽ điều này:

   grep $USER </etc/passwd | cut -f 7 -d ":"

Điều này không cải thiện bất kỳ câu trả lời đã được đưa ra.
Kusalananda

Điều này sẽ không hoạt động nếu có nhiều người dùng có tác phẩm chung; ví dụ nếu USER=fredsau đó điều này sẽ phù hợp với fred, frederick, alfred, alfredo...
Stephen Harris
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.