Làm cách nào để thay thế bash bằng Python?


13

Theo câu trả lời được chấp nhận cho câu hỏi SO này: Python có thể tạo ra một sự thay thế bash tuyệt vời .

Câu hỏi của tôi sau đó là: làm thế nào để tôi thực hiện một chuyển đổi liền mạch? Tôi nghĩ rằng điều chính để sắp xếp để thực hiện một chuyển đổi như vậy sẽ là: khi bắt đầu một thiết bị đầu cuối ảo, hãy gọi một số vỏ Python (mặc dù vậy?), Chứ không phải là một cái gì đó như vỏ Bourne.

Điều đó có ý nghĩa? Nếu có, làm thế nào tôi có thể làm điều đó? Bản so sánh Wikipedia này về các shell thông thường không liệt kê một shell Python: So sánh các shell lệnh

Câu trả lời:


15

Chủ đề đó và câu trả lời được chấp nhận của nó cụ thể là về việc sử dụng Python cho kịch bản shell , chứ không phải như một trình bao tương tác .

Để viết tập lệnh bằng một ngôn ngữ khác, hãy đặt ví dụ #!/usr/bin/env pythonthay vì #!/bin/bashở đầu tập lệnh của bạn.

Nếu bạn muốn thử một shell tương tác khác, chỉ cần chạy nó, ví dụ gõ ipythonvào dấu nhắc shell hiện có của bạn. Nếu bạn đã quyết định áp dụng shell đó, hãy đặt SHELLbiến môi trường vào đầu phiên của bạn ( ~/.profiletrong hầu hết các môi trường hoặc trong ~/.pam_environment), ví dụ export SHELL=/usr/bin/ipython( .profilecú pháp) hoặc SHELL="/usr/bin/ipython"( .pam_environmentcú pháp).

Theo tôi, không có hệ vỏ nào mà tôi thấy dựa trên các ngôn ngữ nâng cao như Perl hoặc Python là đủ tốt để sử dụng tương tác theo quan điểm của tôi. Chúng quá dài dòng cho các tác vụ thông thường, đặc biệt là công việc chung của trình bao là khởi chạy một ứng dụng. Tôi đã viết về một chủ đề tương tự 4 năm trước ; Tôi không nghĩ rằng tình hình đã được cải thiện về cơ bản kể từ đó.


14

Tôi biết câu hỏi này khá cũ, nhưng có một lớp vỏ mới dựa trên siêu bộ Python 3 được gọi là xonsh có thể là thứ bạn đang tìm kiếm.

từ trang web:

Xonsh là ngôn ngữ shell và dấu nhắc lệnh của Python-ish, BASHwards. Ngôn ngữ này là siêu ngôn ngữ của Python 3.4+ với các nguyên hàm shell bổ sung mà bạn đã quen với Bash và IPython. Nó hoạt động trên tất cả các hệ thống chính bao gồm Linux, Mac OSX và Windows. Xonsh có nghĩa là để sử dụng hàng ngày của các chuyên gia và người mới.

Xem nó tại xon.sh


2

Thay vì không

Lý do là Python không hỗ trợ xử lý các đặc quyền nâng cao. Trường hợp xấu nhất là với các tập tin hệ thống chỉnh sửa.

Đối chiếu

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

với:

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"})

Bạn không thể sử dụng xử lý tệp gốc của Python cho các tệp hệ thống, vì Python vốn không thể thực thi các lệnh con với các đặc quyền nâng cao.


1
Tôi không chắc tại sao sudo lại tệ hơn bất cứ thứ gì khác. Nếu bạn cần sudo, bạn cần chạy / usr / bin / sudo, đây là một chương trình giống như bất kỳ chương trình nào khác. Ví dụ cụ thể của bạn ở đây cho thấy sự khó khăn trong việc nắm bắt tâm lý và sử dụng nó từ Python; một cách tốt hơn có thể là có thể, nhưng nó sẽ là một bản dịch ít trực tiếp hơn.
rosuav

1

Ipython là ok. Ngoài ra, hãy nhìn vào thư viện 'os'.


Bạn nói đúng, IPython đáng lẽ phải là một lựa chọn rõ ràng ... nhưng làm cách nào để IPython bắt đầu bên trong trình giả lập thiết bị đầu cuối, hoặc bên trong một thiết bị đầu cuối thực tế, tự động?
dùng89

Lệnh: chfn -s $ (mà ipython)
user400344 27/12/14

Điều đó đã bị cắt xén ... Chỉ là: chfn -s $ (mà ipython) ... Hãy chắc chắn rằng đường dẫn đầy đủ đến ipython nằm trong / etc / shell.
dùng400344

một tùy chọn khác là exec ipythontừ tệp khởi động shell hiện tại, như.bashrc
ptman
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.