Seeing the World as the Shell Sees It
Seeing the World as the Shell Sees It
Mỗi khi ta nhập một dòng lệnh và nhấn phím enter, bash sẽ thực hiện một số quá trình trên văn bản trước khi nó thực hiện lệnh của chúng ta. echo là một nội trang của shell thực hiện một tác vụ rất đơn giản. Nó in ra các đối số văn bản của nó trên đầu ra tiêu chuẩn:
Ký tự “*” có nghĩa là khớp với bất kỳ ký tự nào trong tên tệp.
Cơ chế mà các ký tự đại diện hoạt động được gọi là mở rộng tên đường dẫn. Nếu ta thử một số kỹ thuật mà chúng ta đã sử dụng trong các bài học trước đó của mình, ta sẽ thấy rằng chúng thực sự là sự mở rộng. Đưa ra một thư mục chính trông giống như sau:
Tôi có thể thực hiện các mở rộng như sau:
Như ta nhớ lại từ phần giới thiệu về lệnh cd, ký tự dấu ngã (“~”) có một ý nghĩa đặc biệt. Khi được sử dụng ở đầu một từ, nó sẽ mở rộng thành tên của thư mục chính của người dùng được đặt tên, hoặc nếu không có người dùng nào được đặt tên, thì thư mục chính của người dùng hiện tại:
Vỏ cho phép số học được thực hiện bằng cách khai triển. Điều này cho phép tôi sử dụng dấu nhắc shell như một máy tính.
Dấu cách không có ý nghĩa trong các biểu thức số học và các biểu thức có thể được lồng vào nhau. Ví dụ, để nhân năm bình phương với ba:
Dấu ngoặc đơn có thể được sử dụng để nhóm nhiều biểu thức con. Với kỹ thuật này, ta có thể viết lại ví dụ trên và nhận được kết quả tương tự bằng cách sử dụng một mở rộng duy nhất thay vì hai:
Có lẽ sự mở rộng kỳ lạ nhất được gọi là sự mở rộng dấu ngoặc nhọn. Với nó, chúng ta có thể tạo nhiều chuỗi văn bản từ một mẫu có chứa dấu ngoặc nhọn. Đây là một ví dụ:
Các mẫu được mở rộng dấu ngoặc nhọn có thể chứa một phần đầu được gọi là phần mở đầu và phần cuối được gọi là phần tái bút. Chính biểu thức dấu ngoặc nhọn có thể chứa danh sách các chuỗi được phân tách bằng dấu phẩy hoặc một loạt các số nguyên hoặc các ký tự đơn. Mẫu không được chứa khoảng trắng chưa được trích dẫn.
Dưới đây là một ví dụ sử dụng một loạt các số nguyên:
Ví dụ, nếu ta các nhiếp ảnh gia và có một bộ sưu tập lớn các hình ảnh mà tôi muốn tổ chức- sau nhiều năm và nhiều tháng, điều đầu tiên tôi có thể làm là tạo ra một loạt thư mục có tên ở định dạng số "Năm-Tháng". Theo cách này, thư mục tên sẽ sắp xếp theo thứ tự thời gian. Tôi có thể gõ ra một danh sách đầy đủ thư mục, nhưng đó là rất nhiều công việc và nó dễ xảy ra lỗi. Thay vào đó, tôi có thể làm cái này:
Ta sẽ chỉ đề cập ngắn gọn về việc mở rộng thông số trong chương này, nhưng tôi sẽ đề cập rộng rãi sau. Đó là một tính năng hữu ích hơn trong các tập lệnh shell hơn là trực tiếp trên dòng lệnh. Nhiều khả năng của nó liên quan đến khả năng của hệ thống để lưu trữ các phần nhỏ dữ liệu và cung cấp mỗi đoạn một tên. Nhiều phần như vậy, được gọi đúng hơn là các biến, là có sẵn để kiểm tra của bạn. Ví dụ, biến có tên USER con-có tên người dùng của bạn. Để gọi mở rộng tham số và tiết lộ của USER, bạn sẽ làm điều này:
Có thể nhận thấy rằng với các kiểu mở rộng khác, nếu bạn nhập sai một mẫu, quá trình mở rộng sẽ không diễn ra và lệnh echo sẽ chỉ cần hiển thị mẫu bị gõ nhầm. Với việc mở rộng thông số, nếu bạn viết sai tên của một biến, việc mở rộng sẽ vẫn diễn ra nhưng sẽ dẫn đến một chuỗi trống.
Thay thế lệnh cho phép ta sử dụng đầu ra của lệnh.
Ở đây, tôi đã chuyển kết quả của cpas một đối số cho lệnh lscommand, do đó nhận được danh sách của cpprogram mà không cần phải biết tên đường dẫn đầy đủ của nó. Tôi không chỉ giới hạn ở các lệnh đơn giản. Toàn bộ đường ống có thể được sử dụng (chỉ hiển thị một phần đầu ra):
Trong ví dụ này, kết quả của đường dẫn trở thành danh sách đối số của lệnh tệp. Có một cú pháp thay thế để thay thế lệnh trong trình bao cũ hơn các chương trình cũng được hỗ trợ trong bash. Nó sử dụng dấu ngoặc kép thay vì ký hiệu đô la và dấu ngoặc đơn.
Bây giờ ta đã thấy có bao nhiêu cách shell có thể thực hiện mở rộng, đó là thời gian để học cách chúng ta có thể kiểm soát nó. Lấy ví dụ như sau:
Trong ví dụ đầu tiên, việc tách từ theo trình bao đã loại bỏ khoảng trắng thừa từ danh sách các đối số của lệnh echo.
Trong ví dụ thứ hai, param-mở rộng eter đã thay thế một chuỗi trống cho giá trị $ 1 vì nó là một biến không xác định. Trình bao cung cấp một cơ chế được gọi là trích dẫn để ngăn chặn có chọn lọc các phần mở rộng không mong muốn.
Loại trích dẫn đầu tiên ta sẽ xem xét là dấu ngoặc kép. Nếu ta đặt văn bản bên trong dấu ngoặc kép, tất cả các ký tự đặc biệt được sử dụng bởi shell sẽ mất ý nghĩa đặc biệt và được coi như những ký tự bình thường. Các trường hợp ngoại lệ là $ (ký hiệu đô la), \ (dấu gạch chéo ngược) và `(dấu gạch chéo ngược). Điều này có nghĩa là từ đó tách, mở rộng tên đường dẫn, mở rộng dấu ngã và mở rộng dấu ngoặc nhọn là bị đàn áp; tuy nhiên, mở rộng tham số, mở rộng số học và com- sự thay thế ủy quyền vẫn được thực hiện. Sử dụng dấu ngoặc kép, chúng ta có thể đối phó với tên tệp có chứa dấu cách nhúng. Hãy nói rằng chúng tôi là người không may nạn nhân của một tệp có tên hai words.txt. Nếu chúng tôi cố gắng sử dụng điều này trên lệnh dòng, tách từ sẽ khiến điều này được coi là hai đối số riêng biệt chứ không phải là đối số đơn lẻ mong muốn.
Ở đó! Bây giờ chúng ta không phải tiếp tục gõ những dấu ngoặc kép phiền phức đó nữa. Hãy nhớ rằng, mở rộng tham số, mở rộng số học và thay thế lệnh vẫn diễn ra trong dấu ngoặc kép:
Sau đó tách từ bị chặn và không gian nhúng không được xử lý như dấu phân cách; đúng hơn, chúng trở thành một phần của lập luận. Một khi nhân đôi dấu ngoặc kép được thêm vào, dòng lệnh của tôi chứa một lệnh theo sau bởi đối số duy nhất.
Thực tế là các dòng mới được coi là dấu phân cách bằng cách tách từ cơ chế gây ra một hiệu ứng thú vị, mặc dù tinh vi, trên nhóm lệnh thay thế- sự. Hãy xem xét những điều sau:
Nếu ta cần ngăn chặn tất cả các mở rộng, ta sử dụng các dấu ngoặc kép. Dưới đây là so sánh các dấu ngoặc kép, dấu ngoặc kép và dấu ngoặc kép không được trích dẫn:
Đôi khi ta chỉ muốn trích dẫn một ký tự duy nhất. Để làm điều này, ta có thể nhường một ký tự có dấu gạch chéo ngược, trong ngữ cảnh này được gọi là ký tự thoát tính cách. Thường thì điều này được thực hiện bên trong dấu ngoặc kép để ngăn chặn một cách có chọn lọc.
Nó cũng thường được sử dụng để loại bỏ ý nghĩa đặc biệt của một ký tự trong tên tệp. Ví dụ, có thể sử dụng các ký tự trong tên tệp thường có ý nghĩa đặc biệt đối với trình bao. Những thứ này sẽ bao gồm $,!, &, dấu cách và các dấu cách khác. Để bao gồm một ký tự đặc biệt trong một tệp- tên, tôi có thể làm điều này:
Để cho phép một ký tự gạch chéo ngược xuất hiện, hãy thoát khỏi ký tự đó bằng cách nhập \\. Ghi chú rằng trong các dấu ngoặc kép, dấu gạch chéo ngược mất đi ý nghĩa đặc biệt của nó và đối xử như một nhân vật bình thường.
Ngoài vai trò là ký tự thoát, dấu gạch chéo ngược được sử dụng như một phần của ký hiệu để đại diện cho một số ký tự đặc biệt được gọi là mã điều khiển. 32 ký tự đầu tiên trong lược đồ mã hóa ASCII được sử dụng để truyền lệnh cho các thiết bị giống như Teletype. Một số mã này quen thuộc (tab, backspace, line feed và xuống dòng), trong khi những thứ khác thì không (null, end-of- truyền và xác nhận).
Sử dụng dấu gạch chéo ngược theo cách này cho phép ta nhúng các dòng mới vào lệnh của mình. Lưu ý rằng để thủ thuật này hoạt động, dòng mới phải được nhập ngay sau dấu gạch chéo ngược. Nếu ta đặt dấu cách sau dấu gạch chéo ngược, dấu cách sẽ bị bỏ qua, không phải dòng mới. Dấu gạch chéo ngược cũng được sử dụng để chèn các ký tự đặc biệt vào văn bản của ta. Chúng được gọi là các ký tự thoát dấu gạch chéo ngược. Dưới đây là những cái phổ biến:
Việc sử dụng các ký tự thoát dấu gạch chéo ngược là rất phổ biến. Ý tưởng này lần đầu tiên xuất hiện trong ngôn ngữ lập trình C. Ngày nay, shell, c ++, perl, python, awk, tcl và nhiều ngôn ngữ lập trình khác sử dụng khái niệm này. Sử dụng lệnh echo với tùy chọn -e sẽ cho phép chúng tôi chứng minh: