Linux & Shell - Shell có bắt buộc không?


8

Một câu hỏi tổng cộng người mới.

Tại sao chúng ta cần một shell trong Linux? Như một ví dụ khi tôi gõ - tìm. -name xy * - Tôi được thông báo rằng shell nhận đầu vào này và gọi lệnh find (đảm bảo thẻ hoang dã được diễn giải chính xác và tất cả điều đó). Điều này có thể được thực hiện mà không có khái niệm về vỏ không? ... nếu shell theo dõi quá trình khác nhau thì điều này không thể được thực hiện mà không có nó?

Ngoài ra, tại sao tôi có thể nhập> ls xy * và nhận được đầu ra thích hợp trong khi tôi cần thoát * với một \ in find - find. -name xy \ * Shell có thực hiện việc mở rộng thẻ hoang dã cho một và không cho thực thi khác không?

Cảm ơn bạn.

linux  bash  shell 

9
Sử dụng Linux không có vỏ cũng giống như lái Ferrari 50 km / h thông qua giao thông thành phố. Tất cả niềm vui sẽ biến mất.
vava

Câu trả lời:


23

Điều này không thể được thực hiện mà không có khái niệm về vỏ?

Ồ không. Bạn cần một cái gì đó diễn giải ý định của bạn và gọi chương trình thích hợp. Thứ đó được gọi là vỏ.

EDIT: Để tránh nhầm lẫn, "shell" không có nghĩa là "giao diện dòng lệnh". Từ http://en.wikipedia.org/wiki/Shell_(computing) :

"Các shell hệ điều hành thường rơi vào một trong hai loại: dòng lệnh và đồ họa. Các shell dòng lệnh cung cấp giao diện dòng lệnh (CLI) cho hệ điều hành, trong khi các shell đồ họa cung cấp giao diện người dùng đồ họa (GUI). mục đích chính của shell là để gọi hoặc "khởi chạy" một chương trình khác, tuy nhiên, shell thường có các khả năng bổ sung như xem nội dung của các thư mục. "

Đối với câu hỏi khác của bạn, shell đang thực hiện mở rộng ký tự đại diện cho cả hai lệnh, nhưng khi bạn đang tìm kiếm tệp bằng find bạn muốn tìm, chứ không phải shell, để thực hiện mở rộng, vì bạn muốn thực hiện trong tìm vị trí đang tìm kiếm trong và không ở vị trí nó được gọi từ; do đó, bạn thoát khỏi dấu * để dừng phần mở rộng của nó, để tìm thấy có thể thấy nó.


Vì vậy, bạn nói rằng trong Windows nút Start được gọi là shell? :-)

5
Nó không phải là một cách sử dụng phổ biến, nhưng GUI là các shell được cho là (ít nhất là nếu chúng chạy bên ngoài kernel). Nút Bắt đầu chỉ là một tính năng của GUI ...
dmckee --- ex-moderator mèo con

Nút bắt đầu chắc chắn là một điều "diễn giải ý định của bạn và gọi chương trình thích hợp". OTOH, Linux shell có thể được gọi là một tính năng của TUI (Giao diện người dùng văn bản).

11
@Paul: Explorer, chương trình cung cấp nút bắt đầu là shell windows. Trong thực tế, nó là một vỏ Windows; nó có thể được thay thế.
trăng

1
Có, nút bắt đầu có thể được xem như một cái vỏ. Không phải là một vỏ tương tác nhưng dù sao cũng là một vỏ. Thông thường, khi ai đó nói "shell", họ có nghĩa là một dấu nhắc tương tác (ví dụ: dấu nhắc lệnh trên windows là shell truyền thống)

5

Tất nhiên bạn có thể làm mọi thứ thông qua GUI. Windows 'Find Files (từ XP trở về trước) tương đương với GUIsh của lệnh bạn đã nhập.

Bây giờ, tại sao người dùng UNIX (và Linux) thích shell? Bởi vì bạn có thể lấy đầu ra, đưa nó vào một chương trình khác và nhận đầu ra khác nhau. Ví dụ:

find | grep burek

Đây là hai lệnh, findgrepmột cho ăn khác. findliệt kê tất cả các tệp trong thư mục hiện tại và tất cả các thư mục con, mỗi thư mục một dòng và chỉ grepin ra những dòng có chứa burek.

Bây giờ, có những thứ khác, phức tạp hơn, chẳng hạn như:

ls -R | sort | uniq

ls -Rliệt kê các tập tin trong các thư mục hiện tại và con và sortsắp xếp đầu ra. uniqsau đó chỉ cung cấp cho chúng tôi các dòng duy nhất.

Bây giờ, trong khi bạn có thể mã tất cả những điều này vào GUI, bạn có thể nhanh chóng thực hiện những thứ khó khăn như vậy với dòng lệnh mà bạn không thể làm với GUI thông thường trừ khi bạn tự viết. Trong trường hợp nào, việc nhập nó vào dòng lệnh sẽ nhanh hơn phải không?

Tóm lại: Nếu bạn hỏi điều này, bạn không cần nó. Dòng lệnh là vô dụng đối với bạn như một người dùng thông thường. Tuy nhiên, dòng lệnh rất tốt cho sysadins, cho các nhà phát triển và những người muốn làm hỏng máy tính của họ một cách nhanh chóng nhanh chóng.


1

Có, bạn có thể chạy lệnh find mà không cần shell - bạn cần một số chương trình để khởi động nó và bạn cần một số chương trình để hiển thị đầu ra của nó. Rất nhiều lần, bạn đang sử dụng các tính năng của trình bao và lệnh đó sẽ cần một trình bao để diễn giải ý định.

ví dụ: đường ống, chuyển hướng và hình cầu là một tính năng của vỏ và sẽ cần một lớp vỏ để diễn giải. "find. -name myfile" không sử dụng bất kỳ tính năng nào của shell và có thể chạy mà không cần shell. "find. -name myfile | sort> output" sử dụng cả đường ống và chuyển hướng và bạn cần một vỏ để diễn giải điều đó.

Đối với việc thoát xy *, sẽ có một chút khác biệt nếu đó là đầu vào cần tìm hoặc đầu ra của một từ, vỏ sẽ mở rộng nó theo một trong hai cách.

Nếu có một tệp có tên xyz trong thư mục hiện tại

tìm thấy . -name xy * sẽ thực sự chạy như tìm. -name xyz, có lẽ không phải là điều bạn muốn.

Nếu bạn tìm thấy. -name xy * và không có tệp nào khớp với xy * trong thư mục hiện tại, nó sẽ chạy dưới dạng find. -tên xy *.

Tương tự, nếu không có tệp nào khớp với xy * trong thư mục hiện tại ls> xy * sẽ tạo một tệp có tên xy *. Nếu có một tệp trùng khớp - giả sử xyz, nó sẽ có nghĩa là ls> xyz. Nếu có một vài tệp khớp với xy * thì ls> xy * sẽ thất bại.

Đọc thêm http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html


Chế độ đọc ở đâu?
Thomi

1

Các hệ điều hành không tầm thường không chạy trình thông dịch dòng lệnh trong kernel.

Họ chạy nó như một chương trình, và chương trình được gọi là một vỏ. Tình huống trên GUI dường như bị lẫn lộn, nhưng ít nhất một số HĐH cũng chạy bên ngoài kernel.

Bây giờ, có hoàn toàn không có nhu cầu sử dụng vỏ để làm việc như vỏ unix, nhưng bạn làm cần một giao diện.


1

Để trả lời câu hỏi thứ hai của bạn ... vỏ sẽ cố gắng mở rộng bất cứ điều gì có thể bất cứ khi nào có thể, trừ khi bạn ngăn chặn nó. Thoát khỏi * ngăn chặn việc mở rộng, thường là cần thiết cho lệnh find.

Không trả lời một câu hỏi bằng một câu hỏi, làm thế nào bạn biết nếu lệnh ls liệt kê các tệp do mở rộng dòng lệnh hoặc do lệnh ls tra cứu danh sách thư mục từ hệ thống tệp một cách hợp pháp? Chẳng hạn, tôi có thể viết shell cho vòng lặp như thế này:

for i in $(ls /home/mydir);

hoặc thích

for i in /home/mydir/*;

họ kết thúc trong cùng một bộ.


0
tại sao tôi có thể gõ> ls xy * và nhận được đầu ra thích hợp trong khi
Tôi cần phải thoát * với một \ in find - find. -tên xy \ * là
Shell thực hiện việc mở rộng thẻ hoang dã cho một và không cho
thực thi khác?

Điểm thoát '*' trong lệnh gọi find là để ngăn shell thực hiện việc mở rộng. Bằng cách thoát nó, bạn đảm bảo rằng tìm thấy sẽ thấy các đối số: ".", "-Name", "xy *". Nếu bạn không thoát khỏi '*', find sẽ thấy ".", "-Name", "xya", "xyz" (giả sử trình bao mở rộng "xy *" thành "xya xyz", điều này sẽ xảy ra nếu chỉ các tập tin bắt đầu xy là xya và xyz). Vì vậy, câu trả lời cho câu hỏi của bạn là không, trình bao không mở rộng '*' trong yêu cầu tìm kiếm của bạn bởi vì bạn rõ ràng đã yêu cầu nó không bằng cách thoát khỏi nó.


0

Shell trong Linux là một cách thuận tiện và thông thường để tương tác với hệ thống tệp trong Linux và chạy các lệnh với các đối số và liên quan đến các biến môi trường. Nó cung cấp rất nhiều tính năng hữu ích, ví dụ, kết nối đầu ra của một quá trình với đầu vào của người khác, chuyển hướng các luồng đầu vào / đầu ra đến / từ các tệp, FIFO, v.v. Một vỏ là một cách tốt để dễ dàng kết hợp một số chương trình nhỏ, mỗi chương trình làm một nhiệm vụ tương đối nhỏ, để cung cấp một cái gì đó hữu ích. Một số chương trình này (như find và ls) được thiết kế để làm việc với chúng trong một trình bao.

Để hiểu sự mở rộng, chỉ cần nhớ rằng một từ (chuỗi giới hạn không gian của các ký tự aplhanumeric và -, và một số ký hiệu khác), với nó chứa *hoặc các ?ký tự mẫu, không được thoát hoặc đặt bên trong dấu ngoặc kép ( ") hoặc dấu nháy đơn ', được thay thế bằng một chuỗi của các từ được phân cách bằng dấu cách với tên tệp khớp với mẫu. Bạn cũng có một từ có dấu hoa thị, sau khi mở rộng, bạn sẽ có 0, một hoặc một vài từ, sẽ được xử lý bằng bash như một số đối số. Ở đây có thiết kế cụ thể của lslệnh: nó phù hợp hoàn hảo với lược đồ này khi được sử dụng ls foo*để hiển thị tất cả các tệp bắt đầu bằng "foo"! Nó được mở rộng thành một cái gì đó như

ls foobar boobaz

và tôi chỉ in các tệp từ các đối số, kiểm tra sự tồn tại và duyệt qua các bộ phát sóng, v.v.

Nhưng đó chủ yếu là câu hỏi của triết học. Trong các hệ thống khác, mọi thứ xuất hiện từ nút "Bắt đầu" và thanh tác vụ. Một số người dùng tốt với nó. Một số cố gắng cài đặt shell giống như linux vào các hệ thống như vậy. Đó là một vấn đề của hương vị, nhưng để lập trình các tập lệnh đơn giản, xử lý các tệp, shell là cực kỳ thuận tiện.


0

Đối với các lệnh tương tác, shell có thể được thay thế bằng GUI.

Nhưng điểm mấu chốt của shell là ngôn ngữ script: bạn có thể tạo toàn bộ chương trình được thực thi trong các tình huống cụ thể (khởi động, mở phiên, mỗi ngày, ...). Tính năng này không thể được thay thế bằng các công cụ khác.


Và tất nhiên bạn có thể lên lịch cho các kịch bản shell vớicron
Wuffers

0

Tất nhiên bạn có thể chạy Linux và không bao giờ sử dụng shell. Ngoài ra, nhiều bản phân phối Linux tiêu chuẩn cung cấp cho người dùng gia đình chính xác những gì họ cần nếu họ chỉ muốn kiểm tra facebook, xem ảnh và gửi email.

Linux có nhiều ưu điểm, nhưng vỏ có lẽ là tốt nhất. Vỏ cho phép chuyển hướng I / O. Đây là những gì mọi người nói về khi đề cập đến đường ống ("|"). Ví dụ:

Tôi muốn kết nối với danh sách các máy và thực hiện khảo sát nơi tài khoản người dùng tồn tại:

for host in `cat hostnames.txt1`; do
echo "Connecting to $host"
ssh $host "cat /etc/passwd | grep -i username"
done

Có thể có 0 máy chủ trong hostnames.txt hoặc có thể có hàng ngàn. Kịch bản này sẽ nén qua và thực hiện khảo sát, đưa thông tin vào thiết bị xuất chuẩn.

Viết kịch bản có thể rất sáng tạo. Tôi có thể sử dụng các ký tự "/ >>" để chuyển hướng đầu vào / đầu ra từ và đến các tệp. Tôi có thể khảo sát tất cả các máy trong tập lệnh ở trên, xuất tên máy chủ từ bất kỳ người dùng nào có tệp, sau đó theo dõi một tập lệnh khác kết nối và thực hiện một số tác vụ trên tài khoản người dùng (khóa / mở khóa / đặt lại pw / xóa / thêm nhóm / vv).

Học hỏi. Đến. Kịch bản. =)

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.