Đây là lệnh rc có thể chạy trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks bằng cách sử dụng một trong nhiều máy trạm trực tuyến miễn phí của chúng tôi như Ubuntu Online, Fedora Online, trình mô phỏng trực tuyến Windows hoặc trình mô phỏng trực tuyến MAC OS
CHƯƠNG TRÌNH:
TÊN
rc - vỏ
SYNOPSIS
rc [-deiIlnopsvx] [-c lệnh] [đối số]
MÔ TẢ
rc là một trình thông dịch lệnh và ngôn ngữ lập trình tương tự như sh(1). Nó dựa trên
AT&T Plan 9 vỏ cùng tên. Shell cung cấp cú pháp giống C (nhiều hơn
vỏ C) và một cơ chế mạnh mẽ để thao tác các biến. Nó khá nhỏ
và khá nhanh, đặc biệt là khi so sánh với các loại vỏ hiện đại. Mục đích sử dụng của nó là
để có tính tương tác, nhưng ngôn ngữ này rất phù hợp với các chữ viết.
LỰA CHỌN
-c Nếu có -c, các lệnh sẽ được thực thi từ đối số ngay sau đó.
Bất kỳ lý lẽ nào nữa để rc được đặt trong $*. Như vậy:
rc -c 'echo $*' 1 2 3
in ra
1 2 3
-d Cờ này gây ra rc không bỏ qua SIGQUIT hoặc SIGTERM. Như vậy rc có thể được thực hiện để đổ
core nếu được gửi SIGQUIT. Cờ này chỉ hữu ích cho việc gỡ lỗi rc.
-e Nếu có cờ -e thì rc sẽ thoát nếu trạng thái thoát của lệnh là
sai (khác không). rc Tuy nhiên, sẽ không thoát nếu điều kiện không thành công, ví dụ: if()
chỉ huy.
-i Nếu có cờ -i hoặc nếu đầu vào rc là từ một thiết bị đầu cuối (như được xác định
by không ổn định(3)) thì rc sẽ ở tương tác cách thức. Nghĩa là, một lời nhắc (từ
$nhanh chóng(1)) sẽ được in trước khi nhập dòng đầu vào và rc sẽ bỏ qua
KÝ.
-I Nếu có cờ -I hoặc nếu đầu vào là rc không phải từ một thiết bị đầu cuối, sau đó rc
sẽ không ở chế độ tương tác. Sẽ không có lời nhắc nào được in và SIGINT sẽ gây ra
rc để thoát ra
-l Nếu có cờ -l hoặc nếu rc's argv[0][0] là dấu gạch ngang (-), thì rc sẽ cư xử
như một shell đăng nhập. Tức là nó sẽ chạy lệnh từ $home/.rcrc, nếu file này
tồn tại trước khi đọc bất kỳ đầu vào nào khác.
-n Cờ này gây ra rc để đọc dữ liệu đầu vào và phân tích nó, nhưng không thực hiện bất kỳ
lệnh. Điều này rất hữu ích cho việc kiểm tra cú pháp trên các tập lệnh. Nếu sử dụng kết hợp
với cờ -x, rc sẽ in từng lệnh khi nó được phân tích cú pháp ở dạng tương tự như
cái được sử dụng để xuất các hàm ra môi trường.
-o Cờ này ngăn cản việc cố gắng mở /dev/null trên tệp thông thường
các bộ mô tả 0, 1 và 2, nếu bất kỳ bộ mô tả nào trong số đó được kế thừa đóng.
-p Cờ này ngăn chặn rc từ việc khởi tạo các hàm shell từ môi trường. Cái này
cho phép rc chạy ở chế độ được bảo vệ, theo đó sẽ trở nên khó khăn hơn đối với rc
tập lệnh bị phá hủy bằng cách đặt các lệnh sai trong môi trường. (Lưu ý rằng
sự hiện diện của lá cờ này không có nghĩa là chạy setuid là an toàn rc kịch bản;
những cảnh báo thông thường về bit setuid vẫn được áp dụng.)
-s Cờ này gây ra rc để đọc từ đầu vào tiêu chuẩn. Mọi đối số đều được đặt trong $*.
-v Cờ này gây ra rc để lặp lại đầu vào của nó với lỗi tiêu chuẩn khi nó được đọc.
-x Cờ này gây ra rc để in mọi lệnh có lỗi tiêu chuẩn trước khi nó được thực thi.
Nó có thể hữu ích cho việc gỡ lỗi rc tập lệnh.
HÀNG
Một lệnh đơn giản là một chuỗi các từ, được phân tách bằng khoảng trắng (dấu cách và tab)
các ký tự kết thúc bằng dòng mới, dấu chấm phẩy (;) hoặc ký hiệu (&). Lời đầu tiên của một
lệnh là tên của lệnh đó. Nếu tên bắt đầu bằng /, ./, hoặc ../ thì tên đó
được sử dụng làm tên đường dẫn tuyệt đối đề cập đến một tệp thực thi. Nếu không thì tên của
lệnh được tra cứu trong bảng hàm shell, lệnh dựng sẵn hoặc dưới dạng tệp trong
các thư mục được đặt tên bởi $path.
Tiểu sử Nhiệm vụ
Lệnh kết thúc bằng & được chạy ở chế độ nền; tức là shell trả về ngay lập tức
thay vì chờ lệnh hoàn thành. Các lệnh nền có /dev/null
được kết nối với đầu vào tiêu chuẩn của họ trừ khi có sự chuyển hướng rõ ràng cho đầu vào tiêu chuẩn
đã sử dụng.
Phiếu phụ
Một lệnh có tiền tố là ký hiệu (@) được thực thi trong một hệ vỏ con. Điều này cách nhiệt
shell cha khỏi ảnh hưởng của các hoạt động thay đổi trạng thái, chẳng hạn như cd hoặc một biến
phân công. Ví dụ:
@ {đĩa CD ..; làm}
sẽ chạy làm cho(1) trong thư mục mẹ (..), nhưng để shell chạy trong thư mục hiện tại
thư mục.
Dòng tiếp tục
Một dòng logic dài có thể được tiếp tục trên một số dòng vật lý bằng cách kết thúc mỗi dòng
(ngoại trừ cái cuối cùng) có dấu gạch chéo ngược (\). Trình tự dấu gạch chéo ngược-dòng mới được coi là một
không gian. Dấu gạch chéo ngược không có gì đặc biệt đối với rc. (Ngoài ra, bên trong trích dẫn a
dấu gạch chéo ngược mất đi ý nghĩa đặc biệt ngay cả khi nó được theo sau bởi một dòng mới.)
Trích dẫn
rc giải thích một số ký tự đặc biệt; ký tự đặc biệt tự động chấm dứt
từ. Các ký tự sau đây là đặc biệt:
#; & | ^ $ = `` {} () <>
Dấu ngoặc đơn (') ngăn chặn việc xử lý đặc biệt đối với bất kỳ ký tự nào ngoài chính nó. Tất cả
ký tự, bao gồm ký tự điều khiển, dòng mới và dấu gạch chéo ngược giữa hai trích dẫn
các ký tự được coi là một chuỗi không được giải thích. Bản thân một ký tự trích dẫn có thể được trích dẫn
bằng cách đặt hai dấu ngoặc kép liên tiếp. Trình tự tối thiểu cần thiết để nhập ký tự trích dẫn
là ''''. Chuỗi trống được biểu thị bằng ''. Như vậy:
echo 'Kế hoạch là gì, Stan?'
in ra
Kế hoạch là gì, Stan?
Ký hiệu số (#) bắt đầu nhận xét trong rc. Tất cả các ký tự cho đến nhưng không bao gồm
dòng mới tiếp theo sẽ bị bỏ qua. Lưu ý rằng việc tiếp tục dấu gạch chéo ngược không hoạt động bên trong
nhận xét, tức là dấu gạch chéo ngược bị bỏ qua cùng với mọi thứ khác.
Nhóm
Không hoặc nhiều lệnh có thể được nhóm trong dấu ngoặc nhọn (“{” và “}”) và sau đó được coi là
một lệnh. Niềng răng không xác định phạm vi; chúng chỉ được sử dụng để ra lệnh
phân nhóm. Đặc biệt, hãy cảnh giác với lệnh:
cho (i) {
lệnh
} | yêu cầu
Vì pipe liên kết chặt chẽ hơn for nên lệnh này không thực hiện được những gì người dùng mong đợi
ĐẾN. Thay vào đó, hãy đặt toàn bộ câu lệnh for trong dấu ngoặc nhọn:
{cho (i) lệnh} | yêu cầu
May mắn thay, rcngữ pháp của nó đủ đơn giản để một người dùng (tự tin) có thể hiểu nó bằng cách
kiểm tra bộ xương yac(1) ngữ pháp ở cuối trang hướng dẫn này (xem phần
quyền NGỮ PHÁP).
Đầu vào và đầu ra
Đầu ra tiêu chuẩn có thể được chuyển hướng đến một tệp có
lệnh> tập tin
và đầu vào tiêu chuẩn có thể được lấy từ một tệp có
lệnh < tập tin
Chuyển hướng có thể xuất hiện ở bất cứ đâu trong dòng: từ theo sau biểu tượng chuyển hướng là
tên tệp và phải được trích dẫn nếu nó chứa dấu cách hoặc các ký tự đặc biệt khác. Những cái này
đều tương đương.
echo 1 2 3 > foo
> foo echo 1 2 3
echo 1 2 > foo 3
Các bộ mô tả tệp khác 0 và 1 cũng có thể được chỉ định. Ví dụ: để chuyển hướng
lỗi tiêu chuẩn cho một tập tin, sử dụng:
lệnh >[2] tập tin
Để sao chép bộ mô tả tệp, hãy sử dụng >[n=m]. Do đó để chuyển hướng cả hai tiêu chuẩn
lỗi đầu ra và lỗi tiêu chuẩn cho cùng một tệp, hãy sử dụng
lệnh > tập tin >[2=1]
Như trong sh, chuyển hướng được xử lý từ trái sang phải. Như vậy trình tự này
lệnh >[2=1] > tập tin
thường là một sai lầm. Đầu tiên nó sao chép lỗi tiêu chuẩn thành đầu ra tiêu chuẩn; sau đó
chuyển hướng đầu ra tiêu chuẩn sang một tệp, để lại lỗi tiêu chuẩn ở bất kỳ đầu ra tiêu chuẩn nào
ban đầu là vậy.
Để đóng bộ mô tả tệp có thể đang mở, hãy sử dụng >[n=]. Ví dụ: để đóng tập tin
mô tả 7:
lệnh >[7=]
Lưu ý rằng không có khoảng trắng nào có thể xuất hiện trong các cấu trúc này:
lệnh > tệp [2]
sẽ gửi đầu ra của lệnh tới một tệp có tên [2], với tên tệp dự định
xuất hiện trong danh sách đối số của lệnh.
Để đặt đầu ra của lệnh ở cuối tệp đã có sẵn, hãy sử dụng:
lệnh >> tập tin
Nếu tập tin không tồn tại thì nó sẽ được tạo.
“Tài liệu ở đây” được hỗ trợ như trong sh với việc sử dụng
lệnh << 'eof-điểm đánh dấu'
Các dòng tiếp theo tạo thành đầu vào tiêu chuẩn của lệnh cho đến khi một dòng chỉ chứa
điểm đánh dấu, trong trường hợp này là eof-marker, gặp phải.
Nếu điểm đánh dấu cuối tập tin được đặt trong dấu ngoặc kép thì không có sự thay thế biến nào xảy ra
bên trong tài liệu ở đây. Mặt khác, mọi biến được thay thế bằng dấu cách của nó-
giá trị danh sách riêng biệt (xem Bằng phẳng Chức năng, bên dưới) và nếu ký tự ^ theo sau một biến
tên, nó sẽ bị xóa. Điều này cho phép sử dụng rõ ràng các biến liền kề với văn bản, như trong
$biến^theo dõi
Để bao gồm một ký tự $ trong tài liệu ở đây khi đang có một điểm đánh dấu cuối tệp không được trích dẫn
đã sử dụng, hãy nhập nó dưới dạng $$.
Ngoài ra, rc hỗ trợ “chuỗi ở đây”, giống như các tài liệu ở đây, ngoại trừ đầu vào đó
được lấy trực tiếp từ một chuỗi trên dòng lệnh. Việc sử dụng chúng được minh họa ở đây:
cat <<< 'đây là chuỗi ở đây' | wc
(Tính năng này cho phép rc xuất các chức năng sử dụng tài liệu ở đây ra môi trường;
tác giả không mong đợi người dùng thấy tính năng này hữu ích.)
Ống
Hai hoặc nhiều lệnh có thể được kết hợp trong một đường ống bằng cách đặt thanh dọc (|) giữa
họ. Đầu ra tiêu chuẩn (mô tả tệp 1) của lệnh bên trái được gắn với
đầu vào tiêu chuẩn (bộ mô tả tệp 0) của lệnh bên phải. Ký hiệu |[n=m]
chỉ ra rằng bộ mô tả tập tin n của quá trình bên trái được kết nối với bộ mô tả tập tin m of
đúng quy trình. |[n] là cách viết tắt của |[n=0]. Ví dụ, để truyền tải tiêu chuẩn
lỗi của một lệnh để wc(1), sử dụng:
lệnh |[2] wc
Giống như chuyển hướng tệp, không có khoảng trắng nào có thể xuất hiện trong cấu trúc chỉ định tệp được đánh số
bộ mô tả.
Trạng thái thoát của một đường dẫn được coi là đúng khi và chỉ khi mọi lệnh trong
đường ống thoát đúng.
Lệnh as Lập luận
Một số lệnh như CMP(1) hoặc khác(1), lấy đối số của họ trên dòng lệnh và thực hiện
không đọc đầu vào từ đầu vào tiêu chuẩn. Đôi khi thuận tiện để xây dựng phi tuyến
đường ống để một lệnh như CMP có thể đọc đầu ra của hai lệnh khác cùng một lúc.
rc nó có giống thế này không:
cmp <{lệnh} <{lệnh}
so sánh đầu ra của hai lệnh trong dấu ngoặc nhọn. Lưu ý: vì hình thức chuyển hướng này
được thực hiện bằng một số loại đường ống và vì người ta không thể tìm kiếm(2) trên một đường ống, lệnh
sử dụng tìm kiếm(2) sẽ treo. Ví dụ: một số phiên bản của khác(1) sử dụng tìm kiếm(2) trên của họ
đầu vào.
Dữ liệu có thể được gửi xuống một đường ống tới một số lệnh bằng cách sử dụng tee(1) và phiên bản đầu ra của
ký hiệu này:
echo xin chào | tee >{sed 's/^/p1 /'} >{sed 's/^/p2 /'}
KIỂM SOÁT CẤU TRÚC
Những điều sau đây có thể được sử dụng cho luồng điều khiển trong rc:
Nếu khác Báo cáo
nếuthử nghiệm) {
cmd
} khác cmd
Sản phẩm thử nghiệm được thực thi và nếu trạng thái trả về của nó bằng 0 thì lệnh đầu tiên là
được thực hiện, nếu không thì thứ hai là. Niềng răng không bắt buộc xung quanh các lệnh.
Tuy nhiên, một câu lệnh else chỉ hợp lệ nếu nó theo sau dấu ngoặc nhọn trên cùng một câu lệnh.
đường kẻ. Mặt khác, if được coi là đơn giản-if:
nếu (kiểm tra)
lệnh
Trong khi và Trong Loops
trong khi (thử nghiệm) cmd
rc thực hiện thử nghiệm và thực hiện lệnh miễn là thử nghiệm là đúng.
cho (là in ) cmd
rc bộ là cho mỗi phần tử của (có thể chứa các biến và trích dẫn ngược
thay thế) và chạy cmd. Nếu “trong ” thì bị bỏ qua rc sẽ thiết lập là cho mỗi
phần tử của $*. Ví dụ:
for (i in `{ls -F | grep '\*$' | sed 's/\*$//'}) { command }
sẽ đặt $i thành tên của từng tệp trong thư mục hiện tại có thể thực thi được.
Công tắc điện
chuyển ( ) { trường hợp ... }
rc nhìn vào bên trong dấu ngoặc nhọn sau khi chuyển đổi các câu lệnh bắt đầu bằng từ đó
trường hợp. Nếu bất kỳ mẫu nào sau đây khớp với danh sách được cung cấp để chuyển đổi,
sau đó thực hiện các lệnh cho đến khi câu lệnh case tiếp theo được thực thi. Các
siêu ký tự *, [ hoặc ? không nên trích dẫn; việc so khớp chỉ được thực hiện đối với
các dây trong , không chống lại tên tập tin. (Khớp với các phát biểu trường hợp là
tương tự như đối với lệnh ~.)
logic Các nhà khai thác
Có một số nhà khai thác ở rc phụ thuộc vào trạng thái thoát của lệnh.
lệnh && lệnh
thực hiện lệnh đầu tiên và sau đó thực hiện lệnh thứ hai khi và chỉ nếu lệnh đầu tiên
lệnh thoát với trạng thái thoát bằng 0 (“true” trong Unix).
lệnh || yêu cầu
thực hiện lệnh đầu tiên và sau đó thực hiện lệnh thứ hai khi và chỉ nếu lệnh đầu tiên
lệnh thoát với trạng thái thoát khác 0 (“false” trong Unix).
! yêu cầu
phủ nhận trạng thái thoát của một lệnh.
MẪU TRẬN ĐẤU
Có hai hình thức khớp mẫu trong rc. Một là hình cầu vỏ truyền thống. Cái này
xảy ra khi khớp tên tệp trong danh sách đối số:
đối số lệnh ...
Khi có các ký tự *, [ hoặc ? xảy ra trong một đối số hoặc lệnh, rc nhìn vào lập luận
như một mẫu để khớp với các tập tin. (Trái ngược với hành vi mà các shell khác thể hiện,
rc sẽ chỉ thực hiện khớp mẫu nếu một siêu ký tự xuất hiện không được trích dẫn và theo nghĩa đen trong
đầu vào. Như vậy,
foo='*'
echo $ foo
sẽ luôn vang vọng chỉ là một ngôi sao. Để mở rộng các siêu ký tự phi nghĩa đen, một
Câu lệnh eval phải được sử dụng để quét lại đầu vào.) Việc khớp mẫu xảy ra
theo các quy tắc sau: a * khớp với bất kỳ số nào (kể cả số 0) ký tự.
MỘT ? khớp với bất kỳ ký tự đơn nào và [ theo sau là một số ký tự theo sau là
a ] khớp với một ký tự trong lớp đó. Các quy tắc để khớp lớp ký tự là
tương tự như đối với ed(1), ngoại trừ việc đạt được sự phủ định lớp ký tự
với dấu ngã (~), không phải dấu mũ (^), vì dấu mũ đã có ý nghĩa khác trong rc.
rc cũng khớp các mẫu với chuỗi bằng lệnh ~:
~ mẫu mẫu chủ đề ...
~ đặt $status về 0 khi và chỉ khi mẫu được cung cấp khớp với bất kỳ phần tử đơn lẻ nào của
danh sách chủ đề. Như vậy
~ foo f*
đặt trạng thái về 0, trong khi
~ (bar baz) f*
đặt trạng thái thành một. Danh sách null được khớp với danh sách null, vì vậy
~ $foo ()
kiểm tra xem $foo có trống hay không. Điều này cũng có thể đạt được bằng cách kiểm tra
~ $#foo 0
Lưu ý rằng bên trong lệnh ~ rc không khớp các mẫu với tên tệp, vì vậy nó không phù hợp
cần trích dẫn các ký tự *, [ và ?. Tuy nhiên, rc không mở rộng chủ đề chống lại
tên tập tin nếu nó chứa siêu ký tự. Như vậy, lệnh
~ * ?
trả về true nếu bất kỳ tệp nào trong thư mục hiện tại có tên một ký tự.
Nếu lệnh ~ được cung cấp một danh sách làm đối số đầu tiên thì kết quả khớp thành công với
bất kỳ phần tử nào trong danh sách đó sẽ khiến ~ trả về true. Ví dụ:
~ (foo goo sở thú) z*
là đúng.
DANH VÀ BIẾN
Cấu trúc dữ liệu sơ cấp trong rc là danh sách, là một chuỗi các từ. Dấu ngoặc đơn
được sử dụng để nhóm danh sách. Danh sách trống được biểu thị bằng (). Danh sách không có thứ bậc
kết cấu; một danh sách bên trong một danh sách khác được mở rộng để danh sách bên ngoài chứa tất cả
các phần tử của danh sách bên trong. Vì vậy, những điều sau đây đều tương đương
một hai ba
(một hai ba)
((một hai ba)))
Lưu ý rằng chuỗi null '' và danh sách null () là hai thứ rất khác nhau.
Gán chuỗi rỗng cho một biến là một thao tác hợp lệ nhưng nó không loại bỏ chuỗi rỗng đó.
Định nghĩa.
null = '' trống = () echo $#null $#empty
tạo ra đầu ra
1 0
Danh sách Sự kết hợp
Hai danh sách có thể được nối bằng toán tử nối (^). Phép nối hoạt động theo
tuân theo các quy tắc sau: nếu hai danh sách có cùng số phần tử thì
nối là theo cặp:
echo (a- b- c-)^(1 2 3)
tạo ra đầu ra
a-1 b-2 c-3
Ngược lại, ít nhất một trong các danh sách phải có một phần tử duy nhất và sau đó
nối có tính phân phối:
cc -^(O gc) (malloc alloca)^.c
có tác dụng thực hiện lệnh
cc -O -g -c malloc.c alloca.c
Một từ là một danh sách có độ dài một, vì vậy
echo foo^bar
tạo ra đầu ra
foobar
Miễn phí dấu mũ
rc chèn dấu mũ (toán tử ghép) miễn phí trong một số trường hợp nhất định, để
lưu một số thao tác gõ thay mặt người dùng. Ví dụ, ví dụ trên cũng có thể được gõ
trong như:
opts=(O gc) files=(malloc alloca) cc -$opts $files.c
rc chú ý chèn dấu mũ tự do giữa “-” và $opt, cũng như giữa các tệp $
và C. Quy tắc dành cho dấu mũ miễn phí như sau: nếu một từ hoặc từ khóa ngay lập tức
theo sau là một từ, từ khóa, ký hiệu đô la hoặc dấu ngoặc kép khác, sau đó rc chèn một dấu mũ
giữa họ.
Biến
Một danh sách có thể được gán cho một biến bằng cách sử dụng ký hiệu:
là =
Biến đặc biệt * cũng có thể được gán để sử dụng ký hiệu này; rc không có định được xây dựng trong.
Bất kỳ chuỗi ký tự nào không trống, ngoại trừ chuỗi chỉ bao gồm các chữ số, đều có thể được sử dụng
dưới dạng tên biến. Có thể sử dụng bất kỳ ký tự nào ngoại trừ =, nhưng phải có các ký tự đặc biệt
được trích dẫn. Tất cả các biến do người dùng xác định sẽ được xuất vào môi trường.
Giá trị của một biến được tham chiếu bằng toán tử đô la ($):
$là
Bất kỳ biến nào chưa được gán giá trị đều trả về danh sách null, (), khi
được tham chiếu. Nhiều tài liệu tham khảo được phép:
a = foo
b = a
tiếng vang $ $ b
in
foo
Định nghĩa của một biến cũng có thể bị loại bỏ bằng cách gán danh sách null cho một biến:
là=()
Để “chăm sóc miễn phí” hoạt động chính xác, rc phải đưa ra những giả định nhất định về những gì
các ký tự có thể xuất hiện trong tên biến. rc giả sử rằng một tên biến chỉ bao gồm
gồm các ký tự chữ và số, dấu gạch dưới (_) và dấu sao (*). Để tham chiếu một biến với
các ký tự khác trong tên của nó, trích dẫn tên biến. Như vậy:
echo $'we$Ird:Variab!le'
Địa phương Biến
Bất kỳ số lượng phép gán biến nào cũng có thể được thực hiện cục bộ thành một lệnh bằng cách gõ:
a=foo b=bar ... lệnh
Lệnh này có thể là lệnh ghép, ví dụ:
đường dẫn=. nếu=() {
...
}
đặt đường dẫn đến . và loại bỏ if trong suốt thời gian của một lệnh ghép dài.
Biến Đăng ký
Các biến có thể được đăng ký bằng ký hiệu
$var(n)
Ở đâu n là danh sách các số nguyên (gốc 1). Dấu ngoặc đơn mở đầu phải theo sau
tên biến. Danh sách các chỉ số dưới không nhất thiết phải theo thứ tự hoặc thậm chí là duy nhất. Như vậy,
a=(một hai ba)
tiếng vang $a(3 3 3)
in
ba ba ba
If n tham chiếu một phần tử không tồn tại, sau đó $var(n) trả về danh sách rỗng. ký hiệu
$n, Nơi n là một số nguyên, là cách viết tắt của $*(n). Như vậy rclập luận của có thể được tham khảo
tới $1, $2, v.v.
Cũng lưu ý rằng danh sách các chỉ số dưới có thể được đưa ra bởi bất kỳ rchoạt động danh sách của:
$var(`{awk 'BEGIN{for(i=1;i<=10;i++)print i;exit; }'})
trả về 10 phần tử đầu tiên của $var.
Để đếm số phần tử của một biến, hãy sử dụng
$#var
Điều này trả về một danh sách một phần tử, với số phần tử trong $var.
Bằng phẳng Chức năng
Để tạo danh sách một phần tử từ danh sách nhiều phần tử, với các thành phần
được phân tách bằng dấu cách, hãy sử dụng toán tử đô la-caret ($^):
$^var
Điều này rất hữu ích khi cần bỏ qua các quy tắc nối danh sách thông thường. Ví dụ,
để thêm một dấu chấm vào cuối $path, hãy sử dụng:
tiếng vang $^đường dẫn.
Trích dẫn ngược Thay thế
Một danh sách có thể được hình thành từ đầu ra của lệnh bằng cách sử dụng thay thế trích dẫn ngược:
`{ lệnh }
trả về một danh sách được hình thành từ đầu ra tiêu chuẩn của lệnh trong dấu ngoặc nhọn. $ifs được sử dụng để
chia đầu ra thành các phần tử danh sách. Theo mặc định, $ifs có giá trị space-tab-newline.
Dấu ngoặc nhọn có thể được bỏ qua nếu lệnh là một từ đơn. Vì vậy `ls có thể được sử dụng thay thế
của `{ls}. Tính năng cuối cùng này rất hữu ích khi xác định các hàm mở rộng thành các hàm hữu ích.
danh sách đối số. Việc sử dụng thường xuyên là:
fn src { echo *.[chy] }
tiếp theo
wc `src
(Điều này sẽ in ra số từ của tất cả các tệp nguồn C trong thư mục hiện tại.)
Để ghi đè giá trị của $ifs cho một lần thay thế trích dẫn ngược, hãy sử dụng:
`` (danh sách if) { lệnh }
$ifs sẽ tạm thời bị bỏ qua và đầu ra của lệnh sẽ được phân chia theo chỉ định của
danh sách theo sau dấu ngoặc kép. Ví dụ:
`` ($nl :) {con mèo / etc / passwd}
chia tay / etc / passwd vào các trường, giả sử rằng $nl chứa một dòng mới làm giá trị của nó.
DÒNG MÁY CÁN BIÊN DẠNG ĐẶT BIỆT BIẾN
Một số biến được biết đến rc và được đối xử đặc biệt. Trong danh sách sau đây,
“mặc định” chỉ ra rằng rc cung cấp cho biến một giá trị mặc định khi khởi động; “không xuất khẩu”
chỉ ra rằng biến không bao giờ được xuất; và “chỉ đọc” cho biết rằng một nỗ lực
để đặt biến sẽ âm thầm không có hiệu lực.
Ngoài ra, “bí danh” có nghĩa là biến được đặt bí danh giống tên bằng chữ in hoa. Vì
Ví dụ: việc gán cho $cdpath sẽ tự động gán cho $CDPATH và ngược lại-
ngược lại. Nếu $CDPATH được đặt khi rc được bắt đầu, giá trị của nó được nhập vào $cdpath. $ cdpath
và đường dẫn $ là rc danh sách; $CDPATH và $PATH là các danh sách được phân tách bằng dấu hai chấm. Chỉ có những cái tên được đánh vần
ở thủ đô được xuất khẩu vào môi trường.
* (không xuất khẩu)
Danh sách đối số của rc. $1, $2, v.v. giống như $*(1), $*(2), v.v.
0 (mặc định không xuất)
Biến $0 giữ giá trị của argv[0] mà rc đã được gọi.
Ngoài ra, $0 được đặt thành tên của hàm trong suốt thời gian thực hiện
của hàm đó và $0 cũng được đặt thành tên của tệp đang được diễn giải cho
thời hạn của a. yêu cầu. $0 không phải là một phần tử của $* và không bao giờ được coi là
một.
apid (không xuất khẩu)
ID tiến trình của quá trình cuối cùng đã bắt đầu ở chế độ nền.
trợ giúp (chỉ đọc không xuất)
Một danh sách có các phần tử là ID tiến trình của tất cả các tiến trình nền được
vẫn còn sống hoặc đã chết và chưa được chờ đợi.
bqstatus (không xuất)
Trạng thái thoát của rc rẽ nhánh để thực hiện thay thế backquote gần đây nhất.
Lưu ý rằng, không giống như $status, $bqstatus luôn là một danh sách thành phần duy nhất (xem EXIT
TÌNH TRẠNG dưới). Ví dụ:
echo foo |thanh grep; trạng thái là gì
in
trạng thái=(0 1)
trong khi
x=`{echo foo |grep bar}; bqstatus là gì
in
bqstatus=1
cdpath (bí danh)
Danh sách các thư mục để tìm kiếm mục tiêu của một cd yêu cầu. Chuỗi trống
là viết tắt của thư mục hiện tại. Lưu ý rằng nếu biến $cdpath không
chứa thư mục hiện tại thì thư mục hiện tại sẽ không được tìm kiếm;
điều này cho phép tìm kiếm thư mục bắt đầu trong một thư mục khác với thư mục hiện tại
thư mục.
lịch sử
$history chứa tên của tệp mà các lệnh được thêm vào dưới dạng rc đọc
họ. Điều này tạo điều kiện thuận lợi cho việc sử dụng chương trình lịch sử độc lập (chẳng hạn như
lịch sử(1)) phân tích nội dung của tệp lịch sử và trình bày chúng cho rc
để diễn giải lại. Nếu $history không được đặt thì rc không thêm lệnh vào
bất kỳ tập tin.
nhà (bí danh)
Thư mục mặc định cho nội dung cd lệnh và thư mục chứa rc
tìm kiếm tập tin khởi tạo của nó, .rcrc, nếu rc đã được bắt đầu như một thông tin đăng nhập
vỏ sò.
nếu (mặc định)
Dấu tách trường bên trong, được sử dụng để phân tách đầu ra của backquote
các lệnh để tiêu hóa dưới dạng danh sách. Khi khởi động, rc gán danh sách chứa
khoảng trắng ký tự, tab và dòng mới thành $ifs.
đường dẫn (bí danh)
Đây là danh sách các thư mục để tìm kiếm lệnh. Chuỗi trống đứng
cho thư mục hiện tại. Nếu cả $PATH và $path đều không được đặt khi khởi động,
$path giả định giá trị mặc định phù hợp với hệ thống của bạn. Đây thường là
(/ usr / local / bin / usr / bin /usr/ucb / thùng rác .)
pid (mặc định không xuất)
Khi khởi động, $pid được khởi tạo thành ID tiến trình số của chương trình hiện đang chạy
rc.
lời nhắc (mặc định)
Biến này chứa hai lời nhắc (tất nhiên là ở dạng danh sách) rc bản in.
$nhanh chóng(1) được in trước khi mỗi lệnh được đọc và $nhanh chóng(2) được in khi
đầu vào dự kiến sẽ tiếp tục ở dòng tiếp theo. rc đặt $prompt thành ('; ' '') bởi
mặc định. Lý do cho điều này là nó cho phép một rc người dùng lấy lệnh từ
các dòng trước bằng cách sử dụng chuột và trình bày chúng cho rc để giải thích lại; các
dấu chấm phẩy đơn giản bị bỏ qua bởi rc. $ vô giá trịnhanh chóng(2) cũng có nó
sự biện minh: một rc script khi gõ tương tác sẽ không để lại $nhanh chóng(2) của
trên màn hình và do đó có thể được giữ bằng chuột và đặt trực tiếp vào
để sử dụng làm tập lệnh shell mà không cần chỉnh sửa thêm.
lời nhắc (chức năng)
Nếu hàm này được xác định thì nó sẽ được thực thi mỗi lần rc sắp in
$nhanh chóng(1).
trạng thái (chỉ đọc không xuất)
Trạng thái thoát của lệnh cuối cùng. Nếu lệnh thoát với một giá trị số,
con số đó là trạng thái. Nếu lệnh chết kèm theo tín hiệu, trạng thái là
tên tín hiệu đó; nếu tệp lõi được tạo, chuỗi “+core” sẽ được thêm vào.
Giá trị của $status cho một đường dẫn là một danh sách, với một mục nhập, như trên, cho mỗi mục
quá trình trong đường ống. Ví dụ, lệnh
ls | wc
thường đặt trạng thái $ thành (0 0).
phiên bản (mặc định)
Khi khởi động, phần tử đầu tiên của biến danh sách này được khởi tạo thành một chuỗi
xác định phiên bản này của rc. Phần tử thứ hai được khởi tạo thành một chuỗi
có thể được tìm thấy bởi danh tính(1) và gì mệnh lệnh của scc(1).
CHỨC NĂNG
rc chức năng giống hệt nhau rc các tập lệnh, ngoại trừ việc chúng được lưu trữ trong bộ nhớ và được
tự động xuất ra môi trường. Một hàm shell được khai báo là:
tên fn { lệnh }
rc quét định nghĩa cho đến dấu ngoặc nhọn, do đó hàm có thể bao trùm nhiều hơn một
đường kẻ. Định nghĩa hàm có thể được loại bỏ bằng cách gõ
tên bạn
(Một hoặc nhiều tên có thể được chỉ định. Với định nghĩa đi kèm, tất cả các tên đều nhận được
cùng một định nghĩa. Điều này đôi khi hữu ích khi gán cùng một bộ xử lý tín hiệu cho
nhiều tín hiệu. Nếu không có định nghĩa, tất cả các hàm được đặt tên sẽ bị xóa.) Khi một hàm được
được thực thi, $* được đặt thành các đối số cho hàm đó trong suốt thời gian của lệnh.
Do đó, một định nghĩa hợp lý cho l, một cách viết tắt của ls(1), có thể là:
fn l { ls -FC $* }
nhưng không
fn l { ls -FC } # SAI
GIÁN ĐOẠN VÀ TÍN HIỆU
rc nhận ra một số tín hiệu và cho phép người dùng xác định các hàm shell hoạt động
như bộ xử lý tín hiệu. rc theo mặc định sẽ bẫy SIGINT khi nó ở chế độ tương tác. SIGQUIT
và SIGTERM bị bỏ qua, trừ khi rc đã được gọi bằng cờ -d. Tuy nhiên, người dùng-
trình xử lý tín hiệu được xác định có thể được viết cho các tín hiệu này và tất cả các tín hiệu khác. Cách để xác định
trình xử lý tín hiệu phải viết một hàm theo tên của tín hiệu bằng chữ thường. Như vậy:
fn thở dài { echo gác máy; rm /tmp/rc$pid.*; lối ra }
Ngoài các tín hiệu Unix, rc nhận ra tín hiệu nhân tạo SIGEXIT xảy ra dưới dạng
rc sắp thoát ra.
Để xóa định nghĩa của trình xử lý tín hiệu, hãy xóa nó như thể nó là một định nghĩa thông thường
chức năng. Ví dụ:
ký hiệu fn
trả về trình xử lý SIGINT về giá trị mặc định. Để bỏ qua tín hiệu, hãy đặt
giá trị của bộ xử lý tín hiệu thành {}. Như vậy:
ký hiệu fn {}
làm cho SIGINT bị shell bỏ qua. Chỉ những tín hiệu bị bỏ qua mới được truyền
vào các chương trình được điều hành bởi rc; chức năng tín hiệu không được xuất khẩu.
Trên các hệ thống Unix dựa trên Hệ thống V, rc sẽ không cho phép bạn bẫy SIGCLD.
ĐƯỢC XÂY DỰNG TRONG HÀNG
Các lệnh dựng sẵn thực thi trong ngữ cảnh của shell, nhưng mặt khác hoạt động giống hệt như
các lệnh khác. Mặc dù !, ~ và @ không nói đúng ra là các lệnh dựng sẵn, chúng có thể
thường được sử dụng như vậy.
. [-i] hồ sơ [arg ...]
Đọc hồ sơ làm đầu vào cho rc và thực thi nội dung của nó. Với cờ -i, đầu vào là
tương tác. Do đó, từ bên trong tập lệnh shell,
. -i /dev/tty
làm “điều đúng đắn”.
phá vỡ Ngắt từ phần trong cùng của for hoặc while, như trong C. Đó là một lỗi khi gọi phá vỡ
bên ngoài một vòng lặp. (Lưu ý rằng không có phá vỡ từ khóa giữa các lệnh trong switch
câu lệnh, không giống như C.)
được xây dựng trong lệnh [arg ...]
Thực thi lệnh bỏ qua mọi định nghĩa hàm có cùng tên. Cái này
lệnh hiện diện để cho phép các hàm có cùng tên với nội dung sử dụng
nội dung cơ bản hoặc nhị phân. Ví dụ:
fn ls { nội trang ls -FC $* }
là một cách hợp lý để chuyển một bộ đối số mặc định tới ls(1), trong khi đó
fn ls { ls -FC $* } # SAI
là một đệ quy không kết thúc, sẽ làm cho rc cạn kiệt không gian ngăn xếp của nó và
(cuối cùng) chấm dứt nếu nó được thực thi.
cd [thư mục]
Thay đổi thư mục hiện tại thành thư mục. Biến $cdpath được tìm kiếm
vị trí có thể của thư mục, tương tự như việc tìm kiếm $path để thực thi
các tập tin. Không có lý lẽ, cd thay đổi thư mục hiện tại thành $home.
bỏ lỡ [-n] [--] [arg ...]
In các đối số của nó ra đầu ra tiêu chuẩn, được kết thúc bằng dòng mới. Đối số là
cách nhau bởi dấu cách. Nếu đối số đầu tiên là -n thì không có dòng mới cuối cùng nào được in. Nếu như
đối số đầu tiên là --, sau đó tất cả các đối số khác được lặp lại theo nghĩa đen. Đây là
được sử dụng để lặp lại một chữ -n.
đánh giá [ ]
Nối các phần tử của bằng dấu cách và cung cấp chuỗi kết quả vào rc
để quét lại. Đây là lần duy nhất đầu vào được quét lại trong rc.
giám đốc điều hành [arg ...]
Thay thế rc với lệnh đã cho. Nếu lệnh thực thi chỉ chứa các chuyển hướng thì
những chuyển hướng này áp dụng cho shell hiện tại và shell không thoát ra. Vì
thí dụ,
thực thi >[2] err.out
đặt thêm đầu ra vào lỗi tiêu chuẩn trong tệp lỗi.out.
ra [tình trạng]
Làm cho shell hiện tại thoát ra với lối thoát đã cho tình trạng. Nếu không có đối số là
đã cho, giá trị hiện tại của $status sẽ được sử dụng.
hạn chế [-h] [tài nguyên [giá trị]]
Tương tự như csh(1) hạn chế dựng sẵn, lệnh này hoạt động theo kiểu BSD
giới hạn tài nguyên của một tiến trình. Cờ -h hiển thị/thay đổi giới hạn cứng. Các
các tài nguyên có thể được hiển thị hoặc thay đổi là thời gian CPU, Kích thước tập tin, kích thước dữ liệu, kích thước ngăn xếp,
kích thước lõi, trí nhớvà, nếu được hỗ trợ, bộ mô tả, trí nhớ, chị nhớ,
maxproc, khóa bộ nhớvà ổ khóa. Ví dụ:
giới hạn coredumpsize 0
vô hiệu hóa các kết xuất lõi. Để đặt giới hạn mềm bằng giới hạn cứng:
giới hạn `{giới hạn -h dữ liệu hóa}
newpgrp
Puts rc vào một nhóm quy trình mới. Nội dung này rất hữu ích để thực hiện rc cư xử như thế nào
một lớp vỏ kiểm soát công việc trong một môi trường thù địch. Một ví dụ là NeXT Terminal
chương trình này ngầm giả định rằng mỗi shell mà nó phân nhánh sẽ tự đặt vào một
nhóm quy trình mới.
trở lại [n]
Trả về từ hàm hiện tại, có trạng thái n, Nơi n là trạng thái thoát hợp lệ,
hoặc một danh sách của họ. Vì vậy, việc có
trở lại (sigpipe 1 2 3)
(Điều này thường được sử dụng để cho phép một hàm quay trở lại với trạng thái thoát của một
hệ thống lệnh được thực hiện trước đó.) Nếu n bị bỏ qua thì $status còn lại
không thay đổi. Đó là một lỗi khi gọi trở lại khi không ở trong một hàm.
thay đổi [n]
Xóa n các phần tử từ đầu $* và dịch chuyển các phần tử khác xuống dưới
n. n mặc định là 1.
cái ô [mặt nạ]
Đặt ô hiện tại (xem cái ô(2)) đến bát phân mặt nạ. Nếu không có đối số là
hiện tại, giá trị mặt nạ hiện tại được in.
chờ đợi [pid]
Chờ quá trình với quy định pid, mà chắc hẳn đã được bắt đầu bởi rc, Để
lối ra. Nếu không pid được quy định, rc chờ tất cả các tiến trình con của nó thoát ra.
những gì là [-b] [-f] [-p] [-s] [-v] [--] [tên ...]
In định nghĩa của các đối tượng được đặt tên. Đối với nội dung, nội dung foo được in;
đối với các hàm, bao gồm cả bộ xử lý tín hiệu, định nghĩa của chúng sẽ được in ra; vì
tập tin thực thi, tên đường dẫn được in; và đối với các biến, giá trị của chúng là
được in. Các cờ hạn chế đầu ra ở các nội dung, hàm, chương trình thực thi,
bộ xử lý tín hiệu và các biến tương ứng. Nếu không têns được chỉ định, rc danh sách
tất cả các đối tượng thuộc loại đó. (Điều này không được phép đối với -p.) Không có đối số,
whatis tương đương với whatis -fv và in giá trị của tất cả các biến shell
và các chức năng.
Lưu ý rằng những gì là đầu ra phù hợp làm đầu vào cho rc; bằng cách lưu đầu ra của những gì là
trong một tập tin, có thể tạo lại trạng thái của rc bằng cách tìm nguồn tập tin này
với một . yêu cầu. Một lưu ý khác: không thể sử dụng tập tin whatis -s > để lưu trữ
trạng thái rctrình xử lý tín hiệu của trong một tệp, vì các nội dung có chuyển hướng được chạy
trong một vỏ con, và rc luôn khôi phục bộ xử lý tín hiệu về giá trị mặc định của chúng sau
một cái nĩa().
từ những gì là sử dụng nhận được(3) để phân tích các đối số của nó, bạn có thể sử dụng đặc biệt
đối số -- để chấm dứt cờ của nó. Điều này cho phép bạn sử dụng tên bắt đầu bằng một
dấu gạch ngang, chẳng hạn như lịch sử(1) lệnh. Ví dụ,
cái gì thế -- -p
VÍ DỤ
Sản phẩm thay đổi nội trang chỉ thay đổi $*. Hàm này có thể dịch chuyển bất kỳ biến nào (ngoại trừ $lshift).
fn lshift { lshift=$*; *=$$1; thay đổi $dịch chuyển(2); $dịch chuyển(1)=$* }
Với định nghĩa này,
hải mã = (giày tàu niêm phong-sáp cải bắp vua)
lshift hải mã 3
hải mã là gì
in
hải mã=(vua bắp cải)
Toán tử $^var làm phẳng danh sách bằng cách phân tách từng phần tử bằng dấu cách. Chức năng này
cho phép dấu phân cách là một chuỗi tùy ý.
fn phẳng {
lflat=$*; *=$$1
trong khi () {
tiếng vang -n $1; sự thay đổi
~ $#* 0 && nghỉ
tiếng vang -n $phẳng(2)
}
Với định nghĩa này,
hops=(uunet mcvax ukc tlg)
hoa bia phẳng !
bản in (không có dòng mới cuối cùng)
uunet!mcvax!ukc!tlg
EXIT TÌNH TRẠNG
Trạng thái thoát của rc thường giống với lệnh cuối cùng được thực hiện. Nếu
lệnh cuối cùng là một đường dẫn, rc thoát 0 nếu mọi lệnh trong đường ống đều thực hiện; nếu không thì nó
thoát 1.
rc có thể được thực hiện để thoát với một trạng thái cụ thể bằng cách sử dụng ra được xây dựng trong.
NGỮ PHÁP
Đây là rcngữ pháp của, được chỉnh sửa để loại bỏ các hành động ngữ nghĩa.
%term ANDAND BACKBACK BANG CASE COUNT DUP ELSE END FLAT FN FOR IF IN
%term OROR PIPE REDIR SUB SUBSHELL SWITCH TWIDDLE KHI WORD HUH
% left WHILE ')' ELSE
% left ANDAND OROR '\n'
% còn lại BANG SUBSHELL
% còn lại PIPE
%đúng '$'
% còn lại ĐĂNG KÝ
%bắt đầu rc
%%
rc: cuối dòng
| kết thúc lỗi
kết thúc: KẾT THÚC /* EOF */ | '\N'
cmdsa: cmd ';' | cmd '&'
dòng: cmd | dòng cmdsa
nội dung: cmd | cơ thể cmdsan
cmdsan: cmdsa | cmd '\n'
cú đúp: '{' cơ thể '}'
paren: '(' nội dung ')'
gán: từ '=' đầu tiên
phần kết: /* trống */ | phần kết lại
chuyển hướng: DUP | từ REDIR
trường hợp: từ CASE ';' | TRƯỜNG HỢP từ '\n'
cbody: cmd | trường hợp cbody | cmdsan cbody
iftail: cmd %prec ELSE
| cú đúp ELSE optnl cmd
cmd : /* trống */ %prec KHI
| đơn giản
| phần kết cú đúp
| IF paren optnl iftail
| CHO '(' từ IN từ ')' optnl cmd
| CHO '(' word ')' chọn cmd
| WHILE paren optnl cmd
| SWITCH '(' word ')' optnl '{' cbody '}'
| TWIDDLE từ optcaret
| cmd ANDAND chọn cmd
| cmd HOẶC chọn cmd
| cmd PIPE tùy chọn cmd
| chuyển lại cmd %prec BANG
| gán cmd %prec BANG
| cmd optcaret BANG
| SUBSHELL optcaret cmd
| Dấu ngoặc nhọn từ FN
| từ FN
optcaret: /* trống */ | '^'
đơn giản: đầu tiên | từ đơn giản | chuyển hướng đơn giản
đầu tiên: từ | thanh kiếm '^' đầu tiên
thanh kiếm: từ | từ khóa
từ: thanh kiếm | từ '^' thanh kiếm
từ: thanh kiếm '$'
| '$' thanh kiếm SUB từ ')'
| COUNT thanh kiếm
| thanh kiếm PHẲNG
| ''' thanh kiếm
| ''' nẹp
| BACKBACK ngoặc nhọn | TRỞ LẠI thanh kiếm từ
| '(' từ ')'
| nẹp REDIR
| TỪ
từ khóa: CHO | TRONG | TRONG KHI | NẾU | CÔNG TẮC
| FN | KHÁC | TRƯỜNG HỢP | TRÒ CHUYỆN | BANG | vỏ phụ
từ: /* trống */ | từ từ
optnl: /* trống */ | chọn '\n'
Sử dụng RC trực tuyến bằng dịch vụ onworks.net