ฉันจะแทนที่ bash ด้วย Python ได้อย่างไร


13

ตามที่ได้รับการยอมรับคำตอบสำหรับคำถามนี้ SO: งูหลามสามารถสร้างทดแทนทุบตีที่ดี

คำถามของฉันคือ: ฉันจะเปลี่ยนสวิตช์ได้อย่างไร? ฉันคิดว่าสิ่งสำคัญในการเรียงลำดับเพื่อให้สวิตช์เป็นเช่น: เมื่อเริ่มต้นเทอร์มินัลเสมือนโทรหา Python shell (จะเป็นอย่างไร) แทนที่จะเป็นบอร์นเชลล์

มันสมเหตุสมผลไหม ถ้าใช่ฉันจะทำสิ่งนั้นได้อย่างไร การเปรียบเทียบวิกิพีเดียของเชลล์ทั่วไปไม่ได้แสดงรายการ Python เชลล์เดี่ยว: การเปรียบเทียบเชลล์คำสั่ง

คำตอบ:


16

เธรดนั้นและคำตอบที่ได้รับการยอมรับนั้นเกี่ยวกับการใช้ Python สำหรับการสร้างสคริปต์เชลล์ไม่ใช่เชลล์เชิงโต้ตอบ

หากต้องการเขียนสคริปต์ในภาษาอื่นให้ใส่เช่น#!/usr/bin/env pythonแทนที่จะ#!/bin/bashอยู่ด้านบนสุดของสคริปต์

หากคุณต้องการทดลองใช้เชลล์แบบโต้ตอบที่แตกต่างกันเพียงแค่เรียกใช้เช่นพิมพ์ipythonที่พรอมต์เชลล์ที่คุณมีอยู่ หากคุณตัดสินใจที่จะปรับใช้เชลล์นั้นให้ตั้งค่าSHELLตัวแปรสภาพแวดล้อมในตอนเริ่มต้นเซสชันของคุณ (ใน~/.profileสภาพแวดล้อมส่วนใหญ่หรือใน~/.pam_environment) เช่นexport SHELL=/usr/bin/ipython( .profileไวยากรณ์) หรือSHELL="/usr/bin/ipython"( .pam_environmentไวยากรณ์)

ไม่มีเชลล์ที่ฉันเห็นจากภาษาขั้นสูงเช่น Perl หรือ Python ดีพอสำหรับการใช้งานเชิงโต้ตอบในความคิดของฉัน พวกเขามีความละเอียดมากเกินไปสำหรับงานทั่วไปโดยเฉพาะงานทั่วไปของเชลล์ที่จะเปิดใช้แอปพลิเคชัน ฉันเขียนเกี่ยวกับหัวข้อที่คล้ายกัน 4 ปีที่ผ่านมา ; ฉันไม่คิดว่าสถานการณ์จะดีขึ้นตั้งแต่นั้นมา


14

ฉันรู้ว่าคำถามนี้ค่อนข้างเก่าแล้ว แต่มีเชลล์ใหม่ที่อิงตามชุดของ Python 3 ที่เรียกว่า xonsh ซึ่งอาจเป็นสิ่งที่คุณกำลังมองหา

จากเว็บไซต์:

Xonsh เป็นภาษาภาษา Python-ish, BASHwards ที่มองหาและพร้อมรับคำสั่ง ภาษาเป็นชุดของ Python 3.4+ ที่มีเชลล์พื้นฐานเพิ่มเติมที่คุณคุ้นเคยจาก Bash และ IPython มันทำงานได้กับทุกระบบที่สำคัญรวมถึง Linux, Mac OSX และ Windows Xonsh มีความหมายสำหรับการใช้งานประจำวันของผู้เชี่ยวชาญและมือใหม่

ดูได้ที่ xon.sh


2

ค่อนข้างไม่

เหตุผลก็คือ Python ไม่สนับสนุนการจัดการกับสิทธิ์ระดับสูง กรณีที่แย่ที่สุดคือการแก้ไขไฟล์ระบบ

เปรียบเทียบ

sudo sed -i -e "/\#LXC_DOMAIN/ s/\#//" /etc/default/lxc-net

ด้วย:

out = subprocess.run('''sudo sed -i -e "/\#LXC_DOMAIN/ s/\#//" /etc/default/lxc-net''', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,env={"PATH": "/usr/bin"})

คุณไม่สามารถใช้การจัดการไฟล์เนทิฟของ Python สำหรับไฟล์ระบบได้เนื่องจาก Python ไม่สามารถเรียกใช้งานคำสั่งย่อยได้ด้วยสิทธิ์ระดับสูง


1
ฉันไม่แน่ใจว่าทำไม sudo แย่กว่าสิ่งอื่นใด หากคุณต้องการ sudo คุณต้องเรียกใช้ / usr / bin / sudo ซึ่งเป็นโปรแกรมที่เหมือนกัน ตัวอย่างของคุณที่นี่แสดงให้เห็นถึงความยากลำบากในการใช้ความคิดของเชลล์และใช้มันจาก Python วิธีที่ดีกว่าอาจเป็นไปได้ แต่มันจะเป็นการแปลโดยตรงน้อย
rosuav

1

Ipythonไม่เป็นไร ดูที่ไลบรารี 'os' ด้วย


คุณพูดถูก IPython ควรเป็นตัวเลือกที่ชัดเจน ... แต่ฉันจะให้ IPython เริ่มต้นในโปรแกรมจำลองเทอร์มินัลหรือภายในเทอร์มินัลจริงโดยอัตโนมัติได้อย่างไร
89

คำสั่ง: chfn -s $ (ipython ใด)
user400344

นั่นออกมาบิดเบือนไม่ได้ ... แค่: chfn -s $ (ipython อันไหน) ... ตรวจสอบให้แน่ใจว่าเส้นทางแบบเต็มไปยัง ipython นั้นอยู่ใน / etc / shells
user400344

อีกตัวเลือกหนึ่งคือไปexec ipythonจากไฟล์เริ่มต้นเชลล์ปัจจุบันเช่น.bashrc
ptman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.