Cho mình hỏi bash với shell là gì? Và chúng được dùng để làm gì? Mọi người giải đáp giúp mình nhé
Bash, shell là gì và được dùng để làm gì?
Shell là gì có ăn được không ?
Về cơ bản, SHELL (hay còn gọi là hệ vỏ) là một interface nằm giữa OS Kernel và người dùng, nó cung cấp môi trường để người dùng thao tác với Kernel. Các chương trình shell sẽ làm nhiệm vụ thông dịch (interpret) các lệnh của người dùng sang chương trình có sẵn trên hệ thống từ đó thực thi các chức năng tương ứng. Các lệnh này người dùng có thể nhập trực tiếp qua chế độ tương tác (interactive) hoặc thông qua dạng script. Các shell script sẽ được thông dịch (chứ không phải biên dịch – compile). Điểm khác biệt giữa cách thức hoạt động của shell và trình biên dịch (compiler) đó là:
- Shell đọc các lệnh trong script tuần tự từ trên xuống, tìm vị trí các lệnh đó trong hệ thống để thực thi.
- Compiler sẽ biên dịch các lệnh trong script sang một dạng mà máy tính có thể hiểu được, ví dụ mã máy và sinh ra một chương trình (program) tương ứng. Chương trình này sẽ có thể được sử dụng bởi các shell script sau này.
Còn Bash là cái giống gì thế ?
Bash (Bourne Again Shell): thuộc nhóm Bourne Shell được viết bởi Brian Fox trong khuôn khổ một dự án của GNU cho việc thay thế sh, được công bố rộng rãi vào khoảng 1989. Cung cấp rất nhiều tiện ích và là shell mặc định được sử dụng trên Linux, Mac OS X, Darwin hiện nay. Đây sẽ là đối tượng chúng ta sử dụng và trải nghiệm.
Shell (vỏ sò)
Core và Shell là khái niệm mượn trong ngành xây dựng. Khi xây 1 toà nhà, các kỹ sư + công nhân sẽ lắp đèn, thảm, … thế nhưng đến khi cho thuê, “bố khách hàng” lại không thích vì đèn nhìn không sang, thảm thì như chỗ ngủ cho chó … Nói chung, toàn mấy ông khách khó chiều. Giải pháp là gì? Tao làm những cái cơ bản như móc treo đèn (+ dây diện), ống thoát nhà xí, chỗ để vòi nước … gọi là phần core (phần lõi), còn bố thích gì thì tự bố đi mua, bố lắp vào đó cho con nhờ, gọi là phần shell (phần vỏ).
Cũng như vậy, hệ điều hành cung cấp cho chúng ta các service (gọi là phần core), còn người dùng chúng ta thích gọi service ra thế nào thì tuỳ. Ví dụ, tôi muốn move file, bạn có thể dùng CLI shell, lệnh mv, hoặc có thể dùng GUI shell (file manager). Shell chính là một giao diện người dùng, giúp người dùng thao tác với OS (giống như các app muốn giao tiếp với OS thì cũng phải làm in hệt vậy. Ví dụ, OS sẽ cung cấp các API socket, các app sẽ gọi ra nếu muốn tương tác truyền file)
CLI Shell: ciao tiếp bằng text command (command line interface)
GUI Shell: ciao tiếp bằng đồ hoạ. Thường thì shell đồ hoạ sẽ tổ chức dạng như một bàn làm việc, với các tờ giấy, hồ sơ trên bàn (giống kiểu công chức bàn giấy)
Bash (Bourne Again Shell)
Một nhu cầu nảy sinh khi giao tiếp với OS là “tao thích làm nhiều task” chứ không thích ngồi gõ từng lệnh một mỏi tay lắm. Ngoài ra, các shell (app) cũng cần “thông” nhau, ví dụ như sau khi copy * sang thư mục kia, mày save toàn bộ tên file vào 1 text để sau này tao đối soát. Thế là Bourne Shell ra đời (nó là command interpreter, và thường được gọi là sh)
Bourne Shell support chạy interactive và non-interactive (có tương tác với người dùng), chạy async lẫn sync (chạy tuần tự hoặc không), hỗ trợ flow control, … Tuy nhiên, do khai báo biến, điều khiển flow khó nên một số dev đã cải tiến nó như csh (CShell), ksh (KornShell), ash (AlmShell) cho dễ dùng hơn.
Bash ra đời để hồi sinh cho Bourne Shell. Cũng giống các Unix shell #, Bash hỗ trợ wild card (*), pineline, … và có thể đọc command từ text file gọi là các script. Bash hơn các shell # là nó thiết kế hướng mở, support POSIX command nên extension nhiều vô biên và miễn phí nên được dùng trên hầu hết các OS Unix like hiện nay như Darwin (MAC), Redhat, …
Trên các hệ thống thì /bin/sh sẽ được symbolic link tới bash (có một số hệ thống như Ubuntu, Debian thì link tới dash (Debian AllShell), một dạng shell rút gọn, nhỏ cho thao tác non-interactive nhanh hơn)
Ngoài Bash, có RC (another C shell), syntax giống C nên viết dễ dàng hơn Bash rất nhiều lần.
Nói chung, lập trình bash là một lập trình vất vả và tốn time ^^
Cảm ơn các bạn. Nhưng cho mình hỏi bash, shell dùng để làm gì chẳng hạn như tạo app hay làm một thứ gì đó khác.
Hi, chứng tỏ mình nói ở trên vẫn chưa rõ ràng lắm. ^^
Shell mà mọi người hay nói giờ thường ám chỉ Bash (mặc dù ý nghĩa của Shell là các app gọi xuống các API mà OS kernel cung cấp). Bash cũng là 1 app và ở tại đường dẫn /bin/sh (một số Debian dùng Dash, và cũng cài vào /bin/sh).
Khi bạn bật terminal lên, bash mặc định sẽ được nạp vào và ở chế độ command-line interpreter.
Ví dụ:
- Bạn gõ lệnh: ls -l, bash vì tuân thủ quy tắc POSIX nên nó biết cái lệnh ls này nằm ở đâu, nó nhảy vào thư mục /bin/ và chạy lệnh này, show cái output của ls ra (hiển thị các thư mục). Vậy ứng dụng đầu tiên, bash sẽ tìm các app/tool mặc định của hệ thống và interpreter cái command này cho người dùng.
- Pineline: ls /etc | wc -l
Nó lấy output các thư mục trong /etc rồi vứt làm đầu vào cho lệnh wc (count line) - Viết các non-interactive script, nhất là lúc login: ví dụ như lúc login, bạn setup biến môi trường, save vào log, … (2 file là .profile và .bashrc).
- Viết các script làm multiple command:
#!/bin/bash
# khai báo biến và chào mọi người
STRING="Hello World"
echo $STRING
# nén thư mục /home/linuxconfig để làm backup
tar -czf myhome_directory.tar.gz /home/linuxconfig
# thử loop phát xem sao
for STRING in red green blue
do
echo $STRING
done
- và rất nhiều các ví dụ # nữa.
Bạn có thể hiểu bash script giống như batch trong MS DOS vậy. Ví dụ, khi bạn tắt máy, bạn muốn save tất cả các document, bạn viết một script kiểm tra xem doc nào đang mở và chưa save thì hỏi, doc nào save rồi thì thoát app … và cuối cùng tắt máy. Thay vì làm tay 10 cái click, bạn gõ 1 lệnh (hơi lazy nhưng tiện)
Cái script phía trên (save unsave doc)
WIN_IDs=$(wmctrl -l | awk '$3 != "N/A" {print $1}')
for i in $WIN_IDs; do wmctrl -ic "$i"; done
Bạn có hiểu hết các lệnh k? ^^
Mình dùng Zshell
Thấy zshell cũng nhiều người dùng, nhất là terminal nhiều màu sắc, plugin. Còn viết script thì vẫn chuẩn bash thôi, chứ csh hay ksh, zsh hay tcsh đều không phải default ở các OS # nhau nên khó cross platform ^^
Theo những gì bạn giải thích thì mình hiểu là thay vì mình thao tác bằng cách click chuột thì mình sẽ gõ các lệnh tương ứng vào terminal đúng k bạn.
Nhiều màu sắc vs plugin là của cái oh my zsh thôi chứ zsh cũng giống bash là 1 shell mạnh. Bash thì được mặc định ở nhiều OS rồi vì tuổi đời của nó cũng cao nhưng mà để so sánh thì vẫn có nhiều ý kiến cho rằng zsh hơn bash