การค้นหาเชลล์เริ่มต้นของผู้ใช้ภายในเชลล์สคริปต์


10

ฉันสงสัยว่ามีวิธีหาเชลล์เริ่มต้นของผู้ใช้ปัจจุบันภายในเชลล์สคริปต์หรือไม่?

กรณีการใช้งาน: ฉันกำลังทำงานกับสคริปต์ที่ตั้งค่านามแฝงสำหรับคำสั่งและนามแฝงนี้ตั้งอยู่ภายในเปลือกสคริปต์

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

มีตรรกะในสคริปต์ที่พยายามค้นหาเชลล์เริ่มต้นของผู้ใช้ที่รันสคริปต์และเพิ่มชื่อแทนนี้ในไฟล์ ~ / .bashrc หรือ ~ / .zshrc ที่เกี่ยวข้อง

แต่เมื่อฉันเพิ่ม Shebang ไว้ด้านหน้าสคริปต์และขอให้มันใช้ bash อย่างชัดเจนคำตอบที่โพสต์ที่นี่จะส่งคืน bash ตามที่คาดไว้แม้ว่าฉันจะเรียกใช้สคริปต์นี้บนเทอร์มินัล ZSH

มีวิธีรับเชลล์ประเภทที่สคริปต์ทำงานหรือไม่โดยไม่คำนึงถึงชุด Shebang?

ฉันกำลังมองหาโซลูชันที่ใช้งานได้ทั้งบน Mac และลินุกซ์ทั้งหมด


@StephenRauch ฉันควรจะกล่าวถึงก่อนหน้านี้ฉันกำลังมองหาวิธีการที่ทำงานได้ทั้งบนระบบ Mac และ Linux / etc / passwd บน Mac ไม่ได้มีข้อมูลผู้ใช้และที่ปรึกษาเท่านั้นในโหมดผู้ใช้คนเดียว
Spaniard89

อะไร/etc/passwdมีใน OSX? ฉันดูออนไลน์อย่างรวดเร็วและปรากฏว่ามีเชลล์ไม่ใช่ชื่อผู้ใช้ ID ผู้ใช้ยังคงมีอยู่ทำไมคุณไม่ใช้มัน
terdon

ฉันสงสัยว่ามันเป็นไปได้ไหมที่จะมีรายการกระสุนที่ครบถ้วนสมบูรณ์ หรือไฟล์เริ่มต้นเชลล์ทั้งหมดสอดคล้องกับ {name_of_shell} rc หรือไม่
jamesqf

คำตอบ:


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

ขอบคุณมันใช้งานได้เหมือนมีเสน่ห์! นี่เป็นทางออกเดียวที่อาจใช้ได้กับทั้ง mac และ linux based bistro
Spaniard89

1
BTW ฉันแก้ไขคำสั่งเล็กน้อยเพื่อให้ไม่เชื่อเรื่องระบบปฏิบัติการทั้งหมดfinger $USER | grep 'Shell:*' | cut -f3 -d ":"เนื่องจากตัวเลือก grep -P ไม่รองรับบน Mac
Spaniard89

2
โปรดทราบว่าfingerอาจไม่สามารถติดตั้งในเครื่องทั้งหมด มันเป็นแพคเกจเสริมบนระบบที่ใช้ RedHat
Stephen Harris

1
@Kishorepandey: คุณสามารถใช้getent|grep ^$USER:|cut -f: -f7แทนนิ้วถ้าไม่ได้ติดตั้งนิ้วโดยค่าเริ่มต้น
Ipor Sircer

@Kishorepandey อย่าทำอย่างนี้ ใช้SHELLตัวแปรสภาพแวดล้อมหากมีอยู่ การดูฐานข้อมูลผู้ใช้จะให้ผลลัพธ์ (เชลล์ล็อกอินของผู้ใช้) แต่อาจไม่ใช่ผลลัพธ์ที่ถูกต้อง (เชลล์เชิงโต้ตอบที่ผู้ใช้โปรดปราน) - ขึ้นอยู่กับการกำหนดค่าของผู้ใช้
Gilles 'ดังนั้นหยุดความชั่วร้าย'

19

ตัวแปรสภาพแวดล้อมSHELLจะขยายไปยังเชลล์ล็อกอินเริ่มต้นของผู้ใช้ที่เรียกใช้ (รับค่าจาก/etc/passwd)

สำหรับผู้ใช้รายอื่นคุณต้องทำการประมวลผลด้วย/etc/passwdนี่เป็นตัวอย่างง่ายๆawk:

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

แทนที่foobarด้วยชื่อผู้ใช้จริง

หากคุณมีldap(หรือสิ่งที่คล้ายกันในสถานที่) ใช้getentเพื่อรับฐานข้อมูลแทนการแยกโดยตรง/etc/passwd:

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

หรือวิธีที่สะอาดที่สุดให้getentทำการวิเคราะห์คำ (ขอบคุณ @Kusalananda):

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

3
getent passwd foobarเพื่อข้ามต้องตรงกับบรรทัดใดบรรทัดหนึ่ง
Kusalananda

ขอบคุณสำหรับคำตอบ. ฉันควรได้กล่าวถึงก่อนหน้านี้ฉันกำลังมองหาวิธีการที่ทำงานได้ทั้งบนระบบ Mac และ Linux / etc / passwd บน Mac ไม่ได้มีข้อมูลผู้ใช้และที่ปรึกษาเท่านั้นในโหมดผู้ใช้คนเดียว
Spaniard89

4

เนื่องจากgetentไม่ใช่คำสั่งมาตรฐานบน MacOS คุณอาจต้องการใช้การgetpwuidโทรในระดับต่ำกว่าซึ่งจะปรึกษาบริการการตั้งชื่อที่เครื่องกำหนดค่าไว้ สิ่งนี้อาจต้องมีการโทรออกperlหรือpythonเป็นเรื่องปกติสำหรับแพลตฟอร์ม Unix

เช่นนี้จะส่งคืนเชลล์สำหรับผู้ใช้ปัจจุบัน:

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

2

คุณสามารถรับเชลล์เริ่มต้นของผู้ใช้จากสภาพแวดล้อมดังนี้:

echo $SHELL

แต่ไม่ชอบสิ่งนี้:

echo $0

หลังจะบอกคุณว่าเชลล์สคริปต์ของคุณใช้อยู่ในปัจจุบัน ดังนั้นคุณต้องการตัวเลือกแรกด้านบน



0

บางทีนี่:

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

สิ่งนี้ไม่ได้ปรับปรุงคำตอบที่ให้ไว้แล้ว
Kusalananda

สิ่งนี้จะไม่ทำงานหากมีผู้ใช้หลายคนที่มีงานเหมือนกัน เช่นถ้าUSER=fredแล้วนี้จะตรงกับfred, frederick, alfred, alfredo...
สตีเฟ่นแฮร์ริส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.