Chương 2 · Lệnh và cấu trúc thư mục cơ bản Chapter 2 · Basic Commands and Directory Hierarchy
Dòng lệnh không phải một danh sách lệnh cần thuộc, mà là một ngữ pháp cần hiểu Gõ lệnh giống như nói một câu có ngữ pháp The command line is not a list of commands to memorise but a grammar to understand
Ward gọi chương này là “tài liệu sơ bộ” và nói thẳng rằng bạn có thể đã biết kha khá phần nội dung; dù vậy ông vẫn đề nghị lật qua một lượt, đặc biệt là phần cây thư mục ở Mục 2.19.1 Điều đáng chú ý là ông cố tình viết về các lệnh Unix chứ không phải “các lệnh Linux”: Linux về bản chất là một nhánh Unix, nên những gì bạn học ở đây mang thẳng sang được BSD và các hệ Unix khác, và ông tránh các phần mở rộng giao diện riêng của Linux vì chúng “có xu hướng thiếu ổn định”.1
Chương này dạy bạn cách nói chuyện với máy bằng chữ. Bạn gõ một câu, máy làm một việc. Tác giả bảo: nhiều bạn đã biết rồi, nhưng cứ lật qua cho chắc, nhất là phần các thư mục. Những câu lệnh này không chỉ dùng cho Linux — máy Unix nào cũng hiểu. Nhớ nhé: học ngữ pháp một lần, dùng được ở mọi máy.
Ward calls this chapter "preliminary material" and says plainly that you may already know a substantial amount of it; even so, he asks you to flip through it, especially the directory hierarchy material in Section 2.19.1 Notably, he deliberately writes about Unix commands rather than "Linux commands": Linux is a Unix flavor at heart, so what you learn carries straight over to BSD and other Unix-flavored systems, and he avoids Linux-specific user-interface extensions because they "tend to be unstable."1
Ông còn thêm một lý do thứ hai, và đây là lý do gắn chương 2 vào mạch của cả quyển sách: biết các lệnh cốt lõi “có thể nâng cao hiểu biết của bạn về nhân, vì nhiều lệnh tương ứng trực tiếp với các lời gọi hệ thống”.1 Nói cách khác, chương này không phải một phụ lục tra cứu — nó là cái cửa sổ đầu tiên nhìn xuống tầng nhân mà Chương 1 vừa phác hoạ.
Luận đề của chương: shell là một chương trình chạy lệnh và đồng thời là một môi trường lập trình nhỏ; mọi thứ bạn làm ở dòng lệnh đều quy về ba việc — shell mở rộng những gì bạn gõ, tiến trình đọc và ghi qua các luồng chuẩn, và hệ thống tệp cùng quyền của nó quyết định bạn được chạm vào cái gì.1
Ý chính: shell là người phiên dịch. Bạn gõ câu lệnh, nó dọn dẹp câu đó rồi gọi chương trình chạy. Chương trình nhận chữ vào, trả chữ ra. Và bạn chỉ chạm được vào tệp nào bạn có quyền. Nhớ nhé: gõ — mở rộng — chạy — trả kết quả.
The chapter's thesis: the shell is a program that runs commands and at the same time a small programming environment; everything you do at the command line reduces to three things — the shell expands what you typed, processes read and write through the standard streams, and the filesystem and its permissions decide what you are allowed to touch.1
*, ?, $VAR — shell thay thế trước khi chạy lệnh
Shell dọn câu trước rồi mới gọi chương trình
*, ?, $VAR — the shell substitutes before running the command
/; chế độ tệp quyết định đọc, ghi, chạy
Mọi thứ nằm trong một cây, và có khoá
The hierarchy starts at /; the file mode decides read, write, execute
Cụm khái niệm 01 Concept cluster 01
Shell, cấu trúc một dòng lệnh, và ba luồng chuẩn Shell và đường đi của chữ The shell, the anatomy of a command line, and the three standard streams
Ward đặt shell vào hàng “một trong những phần quan trọng nhất của một hệ Unix”, và định nghĩa nó rất gọn: shell là một chương trình chạy lệnh — những lệnh mà người dùng gõ vào cửa sổ terminal. Các lệnh đó có thể là chương trình khác hoặc tính năng dựng sẵn của chính shell. Ngoài ra, shell còn là một môi trường lập trình nhỏ.1
Shell là người phiên dịch ngồi giữa bạn và máy. Bạn gõ một câu, nó hiểu và sai chương trình đi làm. Có việc nó tự làm lấy, có việc nó nhờ chương trình khác. Nhớ nhé: shell là người nhận lệnh, không phải người làm hết mọi việc.
Ward ranks the shell among "the most important parts of a Unix system," and his definition is compact: a shell is a program that runs commands — the ones users enter into a terminal window. Those commands can be other programs or built-in features of the shell. The shell also serves as a small programming environment.1
Ông nói thêm một câu đáng nhớ cho cả quyển sách: nhiều phần quan trọng của hệ thống thực ra là các shell script — tệp văn bản chứa một chuỗi lệnh shell; vì chúng quan trọng như vậy, ông dành trọn Chương 11 cho chủ đề này.1 Nghĩa là học shell không chỉ để gõ nhanh hơn, mà để đọc được chính hệ điều hành của mình.
Định nghĩa. Có rất nhiều shell Unix khác nhau, nhưng tất cả đều kế thừa đặc tính từ Bourne shell (/bin/sh) — shell chuẩn được phát triển tại Bell Labs cho các phiên bản Unix đầu tiên. Mỗi hệ Unix đều cần một phiên bản Bourne shell để hoạt động đúng.1
Nói đơn giản. Có nhiều loại shell, nhưng tất cả đều là con cháu của một cái shell rất cũ tên là Bourne. Nhớ nhé: khác giọng, nhưng cùng một ngữ pháp gốc.
Definition. There are many different Unix shells, but all derive features from the Bourne shell (/bin/sh), a standard shell developed at Bell Labs for early versions of Unix. Every Unix system needs a version of the Bourne shell in order to function correctly.1
dòng lệnh = chương trình
+ tuỳ chọn (thường bắt đầu bằng -)
+ đối số
cat file1 file2 ...
câu lệnh = tên việc
+ cách làm
+ làm trên cái gì
command line = program
+ options (usually start with -)
+ arguments
cat file1 file2 ...
-
bash · /bin/sh
bash — “Bourne-again shell”, và vì sao
/bin/shthường chỉ là một liên kết bash — cái shell bạn sẽ dùng bash — the "Bourne-again" shell, and why/bin/shis usually just a linkLinux dùng một phiên bản nâng cấp của Bourne shell gọi là bash, viết tắt của “Bourne-again shell”. Nó là shell mặc định trên hầu hết bản phân phối Linux, và trên một hệ Linux thì
/bin/shthường là một liên kết trỏ tới bash. Ward đề nghị bạn dùng bash khi chạy các ví dụ trong sách.1Trên Linux, cái shell bạn gặp gần như luôn là bash. Cái tên
/bin/shthường chỉ là một lối tắt dẫn tới bash thôi. Nhớ nhé: gõ lệnh trên Linux nghĩa là đang nói chuyện với bash.Linux uses an enhanced version of the Bourne shell called bash, the "Bourne-again" shell. It is the default shell on most Linux distributions, and on a Linux system
/bin/shis normally a link to bash. Ward asks you to use bash when running the book's examples.1Bạn gặp nó ở đâuWhere you meet it Nếu bạn dùng tài khoản Unix ở một tổ chức mà bạn không phải quản trị viên, bash có thể không phải shell mặc định; Ward chỉ cách đổi bằng lệnhchsh, hoặc nhờ quản trị viên.1 Khi bạn mở cửa sổ terminal và thấy dấu$, bash đang chờ bạn. If you use a Unix account at an organisation where you aren't the administrator, bash may not be your default shell; Ward points at thechshcommand, or asking your administrator.1Cái tên nói lên điều gì
Trang hướng dẫn của bash mô tả nó là một trình thông dịch ngôn ngữ lệnh tương thích
sh, và giải thích đúng cách đọc tên: Bourne-Again SHell.2 Đây là một cách chơi chữ trên tên Stephen Bourne — tương thích ngược, nhưng “tái sinh”. -
prompt · arguments · options
Cấu trúc một dòng lệnh — chương trình, đối số, tuỳ chọn Một câu lệnh gồm những gì The anatomy of a command — program, arguments, options
Lệnh thường bắt đầu bằng một chương trình cần chạy, theo sau có thể là các đối số cho chương trình biết cần thao tác trên cái gì và theo cách nào. Trong
cat /etc/passwd, chương trình làcatvà có một đối số là/etc/passwd. Nhiều đối số thực ra là tuỳ chọn làm thay đổi hành vi mặc định và thường bắt đầu bằng dấu gạch ngang (-). Ward cũng ghi chú các ngoại lệ không theo cấu trúc này: lệnh dựng sẵn của shell và việc tạm đặt biến môi trường.1Một câu lệnh giống một câu sai bảo: “làm gì — làm thế nào — làm trên cái gì”. Chữ đầu là việc cần làm. Những chữ có dấu gạch ngang phía trước là cách làm. Còn lại là thứ bị làm. Nhớ nhé: chữ đầu là việc, dấu gạch là cách, phần đuôi là đồ vật.
Commands usually begin with a program to run, possibly followed by arguments that tell the program what to operate on and how. In
cat /etc/passwdthe program iscatand there is one argument,/etc/passwd. Many arguments are in fact options that modify the default behavior and typically begin with a dash (-). Ward also notes the exceptions to this structure: shell built-ins and the temporary use of environment variables.1Bạn gặp nó ở đâuWhere you meet it Quy ước in ấn của sách: mọi lệnh người dùng thường bắt đầu bằng một dấu$(dấu nhắc shell) mà bạn không gõ; còn lệnh bắt đầu bằng#phải chạy với quyền siêu người dùng và cần thận trọng hơn.1 Thấy$ở đầu ví dụ thì đừng gõ nó — đó là dấu máy in sẵn. The book's typographic convention: ordinary user commands begin with a$(the shell prompt) that you do not type; commands starting with#are to be run as the superuser and need extra caution.1Dấu nhắc trông như thế nào
Ward mô tả cụ thể: dấu nhắc thường kết thúc bằng ký tự đô-la (
$); trên Ubuntu nó có dạngname@host:path$, còn trên Fedora là[name@host path]$, trong đó name là tên người dùng, host là tên máy, và path là thư mục làm việc hiện tại.1Một lệnh đầu tiên rất có chủ ý
Lệnh
cat /etc/passwdmà ông cho gõ ngay ở Mục 2.2.1 không ngẫu nhiên: nó vừa dạy cấu trúc lệnh, vừa mở ra tệp thông tin hệ thống sẽ được giải thích trọn vẹn ở Chương 7.1 Ông cố tình bảo: “đừng lo tệp này làm gì ngay bây giờ”. -
stdin · stdout
Đầu vào chuẩn và đầu ra chuẩn — vì sao
catkhông đối số lại “nhại” bạn Chữ vào và chữ ra Standard input and output — why barecatechoes you backTiến trình Unix dùng luồng (I/O stream) để đọc và ghi dữ liệu. Luồng rất linh hoạt: nguồn của một luồng vào có thể là một tệp, một thiết bị, một cửa sổ terminal, hoặc thậm chí là luồng ra của một tiến trình khác. Khi bạn chạy
catkhông có tên tệp, nó đọc từ đầu vào chuẩn do nhân Linux cung cấp thay vì từ một luồng nối với tệp — và ở đây đầu vào chuẩn nối với chính terminal của bạn, nên mỗi dòng bạn gõ lại được lặp lại.1Mỗi chương trình có một cái phễu nhận chữ và một cái vòi phun chữ ra. Nếu bạn chạy
catmà không đưa tệp nào, cái phễu của nó nối thẳng vào bàn phím — nên bạn gõ gì nó nhại lại y hệt. Nhớ nhé: không đưa tệp thì nó nghe bàn phím.Unix processes use I/O streams to read and write data. Streams are very flexible: the source of an input stream can be a file, a device, a terminal window, or even the output stream of another process. When you run
catwith no filename it reads from the standard input stream provided by the Linux kernel rather than a stream connected to a file — and here standard input is connected to your terminal, so each line you type comes straight back.1Ward tách bạch hai phím tắt mà người mới rất hay lẫn: CTRL-D trên một dòng trống kết thúc mục nhập đầu vào chuẩn hiện tại từ terminal bằng một thông điệp EOF (end-of-file) — và thường làm chương trình kết thúc; còn CTRL-C thì thường chấm dứt chương trình bất kể đầu vào hay đầu ra của nó.1 Hai phím trông giống nhau nhưng nói hai câu khác hẳn: “hết chữ rồi” và “thôi, dừng đi”.
Bạn gặp nó ở đâuWhere you meet it Rất nhiều lệnh hoạt động nhưcat: không chỉ tệp đầu vào thì đọc từ stdin. Đầu ra thì hơi khác — vài chương trình (nhưcat) chỉ gửi ra stdout, số khác có tuỳ chọn ghi thẳng vào tệp.1 Mọi chương trình đọc chữ đều làm giống nhau: không có tệp thì nghe bàn phím. Many commands behave ascatdoes: with no input file, they read from stdin. Output differs slightly — some programs (likecat) send output only to stdout, while others can write directly to files.1Vì sao lệnh tên là
catWard giải thích: chương trình mang tên cat vì nó thực hiện nối (concatenation) khi in nội dung của nhiều hơn một tệp.1 Cú pháp tổng quát là
cat file1 file2 ...: in lần lượt nội dung từng tệp rồi thoát.1Còn luồng thứ ba
Ngay ở đây Ward báo trước rằng có một luồng vào/ra chuẩn thứ ba tên là lỗi chuẩn (standard error), và hẹn đến Mục 2.14.1 mới bàn.1 Thẻ kế tiếp trong cụm này chính là chỗ hẹn đó.
-
redirection · pipe
Chuyển hướng và ống dẫn —
>,>>,|,<Đổi chỗ chữ đi ra Redirection and pipes —>,>>,|,<Để gửi đầu ra của một lệnh vào tệp thay vì ra terminal, dùng ký tự chuyển hướng
>. Shell sẽ tạo tệp nếu nó chưa tồn tại; nếu tệp đã có, shell xoá sạch (clobber) tệp gốc trước. Muốn nối thêm thay vì ghi đè thì dùng>>. Để gửi đầu ra chuẩn của một lệnh vào đầu vào chuẩn của lệnh khác, dùng ký tự ống dẫn|— và bạn có thể nối bao nhiêu lệnh tuỳ thích, chỉ cần thêm một dấu ống trước mỗi lệnh mới.1Bình thường chữ chạy ra màn hình. Dấu
>bảo nó chạy vào tệp — nhưng tệp cũ sẽ bị xoá trắng trước. Dấu>>thì viết nối vào cuối. Dấu|thì nối vòi của chương trình này vào phễu của chương trình kia. Nhớ nhé: một dấu lớn hơn là ghi đè, hai dấu là viết thêm.To send a command's output to a file instead of the terminal, use the
>redirection character. The shell creates the file if it doesn't exist; if it does exist, the shell clobbers the original first. To append instead of overwrite, use>>. To send one command's standard output into another's standard input, use the pipe character|— and you can chain as many piped commands as you wish, just adding another pipe before each one.1Chiều ngược lại — đưa một tệp vào đầu vào chuẩn của chương trình — dùng toán tử
<:head < /proc/cpuinfo. Ward lập tức hạ thấp tầm quan trọng của nó: vì hầu hết lệnh Unix nhận tên tệp làm đối số, kiểu chuyển hướng này “không phổ biến lắm”; đúng ví dụ trên có thể viết gọn thànhhead /proc/cpuinfo.1 Đây là một chi tiết dễ bị người mới phóng đại.Bạn gặp nó ở đâuWhere you meet it Ward gợi ý thửhead /proc/cpuinforồihead /proc/cpuinfo | tr a-z A-Zđể thấy ống dẫn hoạt động.1 Một ví dụ khác trong chương:grep ie /usr/share/dict/words | less.1 Khi kết quả dài quá, người ta nối nó sanglessđể đọc từng trang. Ward suggests tryinghead /proc/cpuinfoand thenhead /proc/cpuinfo | tr a-z A-Zto see a pipe at work.1 Another example from the chapter:grep ie /usr/share/dict/words | less.1Chống ghi đè
Ward ghi chú rằng một số shell có tham số ngăn việc xoá trắng tệp; với bash, bạn có thể gõ
set -Cđể tránh clobbering.1 Tuỳ chọnnoclobbernày cũng nằm trong chuẩn ngôn ngữ lệnh của POSIX.3Đây là hạ tầng, không phải mẹo
Ward viết rằng một trong những tính năng hay nhất của các luồng chuẩn là bạn có thể dễ dàng thao tác để đọc và ghi vào nơi khác terminal — và đó chính là điều làm nên cách làm việc Unix: các chương trình nhỏ ghép lại bằng ống dẫn.1
-
standard error · 2>
Lỗi chuẩn — luồng thứ ba, và ý nghĩa của con số đứng trước
>Chữ báo lỗi đi đường riêng Standard error — the third stream, and what the number before>meansĐôi khi bạn chuyển hướng đầu ra chuẩn nhưng chương trình vẫn in gì đó ra terminal. Đó là lỗi chuẩn (stderr) — một luồng ra bổ sung dành cho chẩn đoán và gỡ lỗi. Ward minh hoạ bằng
ls /fffffffff > f: tệpfrỗng, nhưng dòngls: cannot access /fffffffff: No such file or directoryvẫn hiện trên màn hình.1Chương trình có hai vòi phun chữ: một vòi cho kết quả, một vòi riêng cho lời than phiền. Bạn hứng vòi kết quả vào tệp, nhưng lời than phiền vẫn rơi ra màn hình. Nhớ nhé: lỗi đi đường riêng, cố ý như vậy.
Occasionally you redirect standard output and the program still prints something to the terminal. That is standard error (stderr), an additional output stream for diagnostics and debugging. Ward illustrates with
ls /fffffffff > f: the filefends up empty, yetls: cannot access /fffffffff: No such file or directorystill appears on the terminal.1Bạn gặp nó ở đâuWhere you meet it Muốn tách hai luồng:ls /fffffffff > f 2> e. Muốn gộp chúng vào cùng một chỗ, dùng ký pháp>&:ls /fffffffff > f 2>&1.1 Muốn giữ cả lời than phiền lại thì phải hứng thêm một cái nữa. To split the streams:ls /fffffffff > f 2> e. To send both to the same place, use the>¬ation:ls /fffffffff > f 2>&1.1Con số là mã luồng
Ward nói rõ: con số
2chỉ định mã luồng (stream ID) mà shell sẽ sửa. Mã1là đầu ra chuẩn — và là mặc định khi bạn viết>trơn — còn2là lỗi chuẩn.1Vì sao tách ra lại là thiết kế tốt
Vì tách luồng nên bạn có thể đưa kết quả sạch qua ống dẫn để xử lý tiếp, trong khi lời cảnh báo vẫn đập vào mắt bạn. Chuẩn POSIX cũng mô tả cùng ba bộ mô tả tệp mặc định 0, 1 và 2 cho mọi shell dòng Bourne.3
Cụm khái niệm 02 Concept cluster 02
Đường dẫn, phép mở rộng, và cách shell tìm ra lệnh Đường đi và cái tên Paths, expansion, and how the shell finds a command
Cây thư mục Unix bắt đầu ở /, cũng gọi là thư mục gốc (root directory). Ký tự phân cách thư mục là dấu gạch chéo /, không phải gạch ngược \. Khi bạn nhắc tới một tệp hay thư mục, bạn chỉ định một đường dẫn (path); đường dẫn bắt đầu bằng / là đường dẫn tuyệt đối, còn đường dẫn không bắt đầu bằng / là đường dẫn tương đối.1
Mọi thứ trong máy nằm trong một cái cây. Gốc của cây tên là /. Muốn chỉ một chỗ, bạn đọc đường đi tới đó. Bắt đầu bằng / là đọc từ gốc; không bắt đầu bằng / là đọc từ chỗ bạn đang đứng. Nhớ nhé: gạch chéo thuận, không phải gạch ngược.
The Unix directory hierarchy starts at /, also called the root directory. The directory separator is the slash (/), not the backslash (\). When you refer to a file or directory you specify a path; a path starting with / is an absolute path, and a path not beginning with / is a relative path.1
Ward dạy hai thành phần đường dẫn đặc biệt bằng ví dụ cụ thể: hai dấu chấm (..) chỉ thư mục cha — nếu bạn đang ở /usr/lib thì .. là /usr và ../bin là /usr/bin; một dấu chấm (.) chỉ chính thư mục hiện tại — ở /usr/lib thì . vẫn là /usr/lib và ./X11 là /usr/lib/X11.1 Ông nói thêm rằng bạn sẽ không phải dùng . nhiều lắm, vì hầu hết lệnh đã mặc định lấy thư mục hiện tại.1
Định nghĩa. Thư mục làm việc hiện tại (current working directory) là thư mục mà một tiến trình — chẳng hạn shell — đang ở trong đó. Mỗi tiến trình có thể tự đặt thư mục làm việc của riêng mình, độc lập với nhau. Lệnh cd thay đổi thư mục làm việc của shell.1
Nói đơn giản. “Chỗ bạn đang đứng” trong cây thư mục. Mỗi chương trình đứng ở chỗ của riêng nó. cd là bước chân. Nhớ nhé: cd là đi, pwd là hỏi mình đang ở đâu.
Definition. The current working directory is the directory a process — such as the shell — is currently in. Each process can independently set its own, and the cd command changes the shell's.1
cd dir # đi tới
cd # về thư mục nhà (~)
mkdir dir # tạo
rmdir dir # xoá (phải rỗng)
pwd -P # đường dẫn thật
cd = đi
cd (trơn) = về nhà
mkdir = tạo thư mục
rmdir = xoá thư mục rỗng
pwd = đang ở đâu
cd dir # go there
cd # back to home (~)
mkdir dir # create
rmdir dir # remove (must be empty)
pwd -P # the real path
-
cd · shell built-in
cdlà lệnh dựng sẵn — và lý do thì rất sâucdkhông phải một chương trình riêngcdis a shell built-in — and the reason runs deepNếu bạn bỏ đối số
dir, shell đưa bạn về thư mục nhà — nơi bạn bắt đầu khi đăng nhập lần đầu; một số chương trình viết tắt thư mục nhà bằng ký hiệu~(dấu ngã).1 Nhưng chi tiết quan trọng hơn nằm ở ghi chú của Ward:cdlà một lệnh dựng sẵn của shell. Nó không thể hoạt động như một chương trình riêng, bởi nếu chạy như một tiến trình con, nó sẽ không thể (trong điều kiện bình thường) thay đổi thư mục làm việc của tiến trình cha.1cdtrơn thì về nhà. Còn vì saocdlại nằm bên trong shell chứ không phải một chương trình riêng? Vì nếu nó là chương trình riêng, nó sẽ đi bộ giùm người khác — nó bước, còn shell vẫn đứng yên. Nhớ nhé: muốn shell đi thì shell phải tự bước.If you omit the
dirargument the shell returns you to your home directory, where you started when you first logged in; some programs abbreviate it with the~(tilde) symbol.1 But the deeper detail is in Ward's note:cdis a shell built-in. It couldn't work as a separate program, because if it ran as a subprocess it could not (normally) change its parent's current working directory.1Bạn gặp nó ở đâuWhere you meet it Ward viết rằng điều này “có thể chưa có vẻ là một phân biệt quan trọng lúc này, nhưng có những lúc biết nó sẽ gỡ được sự bối rối”.1 Đó là lý do bạn không tìm thấycdbằngwhich. Khi bạn tìm mãi không thấy tệpcdở đâu cả. Ward writes that this "may not seem a particularly important distinction at the moment, but there are times when knowing this fact can clear up confusion."1 It is whywhichwon't findcd.Hai lý do cần
pwdWard đưa đúng hai lý do vì sao vẫn cần
pwddù nhiều dấu nhắc đã hiện sẵn thư mục: thứ nhất, không phải dấu nhắc nào cũng hiện — và bạn có thể muốn bỏ nó đi cho đỡ chiếm chỗ; thứ hai, các liên kết tượng trưng đôi khi che mất đường dẫn đầy đủ thật sự, nên hãy dùngpwd -Pđể xoá nhầm lẫn đó.1Xoá thư mục không rỗng
rmdirthất bại nếu thư mục không rỗng; Ward chỉ cách dùngrm -r dirnhưng kèm cảnh báo rất gắt: đây là một trong số ít lệnh có thể gây thiệt hại nghiêm trọng, nhất là khi chạy với quyền siêu người dùng. Ông dặn đừng dùng cờ-rchung với các glob như dấu sao, và trên hết, luôn kiểm tra lại lệnh trước khi chạy.1 -
globbing · wildcards
Glob — shell mở rộng
*trước, chương trình không bao giờ thấy dấu sao Dấu sao là phép của shell, không phải của chương trình Globbing — the shell expands*first; the program never sees the starShell có thể khớp các mẫu đơn giản với tên tệp và thư mục, một quá trình gọi là globbing — tương tự khái niệm ký tự đại diện ở hệ khác. Ký tự glob đơn giản nhất là
*, bảo shell khớp với số lượng ký tự tuỳ ý. Shell khớp các đối số chứa glob với tên tệp, thay thế tên tệp vào chỗ đó, rồi mới chạy dòng lệnh đã sửa; việc thay thế đó gọi là mở rộng (expansion).1Dấu
*nghĩa là “bất cứ chữ gì, bao nhiêu cũng được”. Shell nhìn thấy nó, tự tìm hết các tên tệp khớp, thay vào câu lệnh, rồi mới gọi chương trình. Chương trình chỉ nhận được danh sách tên tệp — nó không hề biết bạn đã gõ dấu sao. Nhớ nhé: dấu sao là việc của shell, không phải việc của chương trình.The shell can match simple patterns against file and directory names, a process known as globbing — similar to wildcards on other systems. The simplest glob character is
*, which tells the shell to match any number of arbitrary characters. The shell matches arguments containing globs to filenames, substitutes the filenames for those arguments, and then runs the revised command line; that substitution is called expansion.1Ward liệt kê ba dạng mở rộng cơ bản:
at*mở rộng thành mọi tên tệp bắt đầu bằngat;*atthành mọi tên kết thúc bằngat;*at*thành mọi tên chứaat.1 Ký tự glob thứ hai là dấu hỏi (?), khớp đúng một ký tự tuỳ ý —b?atkhớpboatvàbrat.1 Nếu không muốn shell mở rộng, hãy bao glob trong nháy đơn:echo '*'in ra một dấu sao.1Bạn gặp nó ở đâuWhere you meet it Ward gọiecholà công cụ “rất hữu ích để tìm ra phép mở rộng” của glob và biến — gõecho *để in danh sách tệp trong thư mục hiện tại.1 Chưa chắc thì gõechotrước để xem shell hiểu thành cái gì. Ward callsechovery useful for finding the expansions of globs and variables — typeecho *to print the files in the current directory.1Khi không có tệp nào khớp
Nếu không tệp nào khớp một glob, bash không mở rộng gì cả và lệnh chạy với ký tự nguyên văn như
*; Ward mời bạn thửecho *dfkdsafhđể thấy.1 Hệ quả: nếu một dấu sao lọt tới chương trình mà chưa được mở rộng, shell không làm gì thêm nữa — tuỳ chương trình quyết định.1Thói quen cần bỏ từ Windows
Ward dặn thẳng: nếu quen dấu nhắc Windows, bạn có thể theo phản xạ gõ
*.*để khớp mọi tệp — “hãy bỏ thói quen này ngay bây giờ”. Trên Linux và Unix bạn phải dùng*; trong shell Unix,*.*chỉ khớp các tệp và thư mục có chứa dấu chấm trong tên. Tên tệp Unix không cần phần mở rộng và thường không có.1 -
dot files
Tệp dấu chấm — không hề đặc biệt, chỉ là bị giấu theo quy ước Tệp bắt đầu bằng dấu chấm thì bị giấu Dot files — nothing special, just hidden by convention
Chạy
lsrồils -atrong thư mục nhà, bạn sẽ thấy khác biệt: không có-a, bạn không thấy các tệp cấu hình gọi là tệp dấu chấm — những tệp và thư mục có tên bắt đầu bằng dấu chấm. Ward nêu ví dụ quen thuộc:.bashrc,.login, và thư mục dấu chấm như.ssh.1 Ông nhấn mạnh: chẳng có gì đặc biệt ở tệp dấu chấm cả; chỉ là một số chương trình không hiện chúng theo mặc định để thư mục nhà của bạn trông không bừa bộn.1Tệp có tên bắt đầu bằng dấu chấm thì
lskhông hiện. Không phải vì nó bí mật, mà vì để thư mục nhà nhìn cho gọn. Muốn thấy thì thêm-a. Nhớ nhé: dấu chấm đầu tên = bị giấu, không phải bị khoá.Run
lsand thenls -ain your home directory and you'll see the difference: without-ayou don't see the configuration files called dot files — files and directories whose names begin with a dot. Ward's familiar examples:.bashrc,.login, and dot directories such as.ssh.1 He stresses that there is nothing special about them; some programs simply don't show them by default so that listing your home directory isn't a complete mess.1Bạn gặp nó ở đâuWhere you meet it Glob của shell cũng không khớp tệp dấu chấm trừ khi bạn dùng mẫu như.*một cách tường minh.1 Dấu sao trơn cũng không chạm tới chúng. Shell globs don't match dot files either unless you explicitly use a pattern such as.*.1Một cái bẫy rất thật
Ward cảnh báo:
.*khớp cả.và..— tức thư mục hiện tại và thư mục cha. Ông gợi ý dùng mẫu như.[^.]*hoặc.??*để lấy mọi tệp dấu chấm trừ hai cái đó.1 Đây chính là loại lỗi biến một lệnh dọn dẹp thành một tai nạn.Đổi mật khẩu và đổi shell
Cùng mạch “thiết lập cá nhân”, Ward dạy
passwdđể đổi mật khẩu — bạn sẽ được hỏi mật khẩu cũ rồi nhập mật khẩu mới hai lần — và khuyên mật khẩu tốt thường là những câu “vô nghĩa” dài mà dễ nhớ, càng dài càng tốt, nhắm tới 16 ký tự trở lên.1 Đổi shell thì dùngchsh, sang zsh, ksh hay tcsh chẳng hạn — nhưng sách giả định bạn chạy bash, nên đổi rồi thì vài ví dụ có thể không chạy.15 -
shell variable · environment variable
Biến shell và biến môi trường — khác nhau ở chỗ ai được thừa kế Hai loại biến: giữ riêng và truyền lại Shell variables and environment variables — the difference is who inherits
Shell có thể lưu các biến tạm gọi là biến shell, chứa giá trị là chuỗi văn bản; một số biến shell điều khiển chính cách shell hành xử — ví dụ bash đọc biến
PS1trước khi hiển thị dấu nhắc.1 Biến môi trường thì giống biến shell nhưng không riêng của shell: mọi tiến trình trên hệ Unix đều có kho lưu biến môi trường. Khác biệt chính là hệ điều hành truyền toàn bộ biến môi trường của shell cho các chương trình mà shell chạy, trong khi biến shell không truy cập được từ các lệnh bạn chạy.1Biến là một cái hộp có tên, bên trong đựng chữ. Có hộp shell giữ riêng cho mình. Có hộp shell đưa theo cho mọi chương trình con mang đi. Muốn hộp được mang theo thì dùng
export. Nhớ nhé: export là gói ghém cho con mang đi.The shell can store temporary variables called shell variables, holding text-string values; some of them control how the shell itself behaves — bash reads the
PS1variable before displaying the prompt.1 An environment variable is like a shell variable but not specific to the shell: all processes on Unix systems have environment variable storage. The main difference is that the operating system passes all of your shell's environment variables to the programs the shell runs, whereas shell variables cannot be accessed in the commands you run.1Bạn gặp nó ở đâuWhere you meet it Gán bằng dấu bằng:STUFF=blah, truy cập bằng$STUFF. Nâng lên thành biến môi trường bằng lệnhexportcủa shell:export STUFF.1 Gõecho $STUFFđể xem trong hộp có gì. Assign with the equal sign:STUFF=blah, and access it with$STUFF. Promote it with the shell'sexportcommand:export STUFF.1Một quy tắc cú pháp nhỏ mà hay sai
Ward ghi chú gọn lỏn: đừng đặt khoảng trắng quanh dấu
=khi gán biến.1 Vì shell tách dòng lệnh theo khoảng trắng, một dấu cách biến phép gán thành một lệnh khác hẳn. -
PATH
PATH— danh sách nơi shell đi tìm, theo thứ tựPATH— danh sách chỗ để tìm chương trìnhPATH— the list of places the shell searches, in orderPATHlà một biến môi trường đặc biệt chứa đường dẫn lệnh: danh sách các thư mục hệ thống mà shell tìm qua khi định vị một lệnh. Khi bạn chạyls, shell tìm chương trìnhlstrong các thư mục liệt kê ởPATH. Nếu có nhiều chương trình trùng tên ở nhiều thư mục trong đường dẫn, shell chạy chương trình khớp đầu tiên.1PATHlà danh sách các ngăn tủ. Bạn gọi tên một chương trình, shell mở lần lượt từng ngăn cho tới khi thấy. Thấy ở ngăn nào trước thì dùng cái đó. Nhớ nhé: ai đứng trước thì thắng.PATHis a special environment variable containing the command path: a list of system directories the shell searches when trying to locate a command. When you runls, the shell searches the directories listed inPATHfor thelsprogram. If programs with the same name appear in several directories in the path, the shell runs the first matching program.1Bạn gặp nó ở đâuWhere you meet it Chạyecho $PATHvà bạn thấy các thành phần ngăn cách bằng dấu hai chấm (:) — ví dụ Ward đưa ra là/usr/local/bin:/usr/bin:/bin.1 Gõecho $PATHđể xem danh sách ngăn tủ của mình. Runecho $PATHand you'll see the components separated by colons (:) — Ward's example is/usr/local/bin:/usr/bin:/bin.1Thêm vào đầu hay vào cuối
Thêm thư mục dir vào đầu để shell tìm ở đó trước:
PATH=dir:$PATH. Hoặc nối vào cuối để tìm sau cùng:PATH=$PATH:dir.1 Thứ tự này chính là thứ tự ưu tiên.Lỡ xoá mất đường dẫn thì sao
Ward trấn an rất cụ thể: bạn có thể vô tình xoá sạch đường dẫn nếu gõ sai
$PATH— nhưng đừng hoảng, thiệt hại không vĩnh viễn, chỉ cần mở một shell mới. Cách dễ nhất là đóng cửa sổ terminal hiện tại và mở cái khác. Muốn hỏng lâu dài thì bạn phải gõ sai trong một tệp cấu hình, và ngay cả thế cũng không khó sửa.1 -
man · info · --help
Trợ giúp trực tuyến — trang
manvà các mục được đánh số Hỏi máy: lệnh này dùng sao? Getting online help — man pages and their numbered sectionsVới các lệnh cơ bản, trang hướng dẫn (man pages) sẽ cho bạn điều cần biết:
man ls. Nhưng Ward hạ kỳ vọng rất thẳng thắn: phần lớn trang man tập trung vào thông tin tra cứu, có thể kèm vài ví dụ và tham chiếu chéo, nhưng chỉ vậy thôi — đừng mong một bài hướng dẫn, và đừng mong văn phong hấp dẫn.1Muốn biết một lệnh dùng thế nào thì gõ
manrồi tên lệnh. Nhưng đừng mong nó dạy bạn như thầy giáo — nó là quyển từ điển, không phải quyển truyện. Nhớ nhé: man là từ điển tra cứu.For basic commands the manual pages will tell you what you need to know:
man ls. But Ward lowers expectations bluntly: most man pages concentrate primarily on reference information, perhaps with some examples and cross-references, but that's about it — don't expect a tutorial, and don't expect an engaging literary style.1Trang man được tham chiếu theo mục đánh số, và khi nhắc tới một trang người ta thường đặt số mục trong ngoặc, như
ping(8).1 Bảng 2-3 của sách liệt kê: 1 lệnh người dùng, 2 lời gọi hệ thống của nhân, 3 tài liệu thư viện lập trình Unix mức cao hơn, 4 thông tin giao diện thiết bị và trình điều khiển, 5 mô tả tệp (tệp cấu hình hệ thống), 6 trò chơi, 7 định dạng tệp, quy ước và bảng mã, 8 lệnh hệ thống và máy chủ.17 Ward còn xếp hạng độ hữu ích: các mục 1, 5, 7 và 8 bổ trợ tốt cho quyển sách; mục 4 có ích ở mức biên; mục 6 “sẽ tuyệt nếu nó lớn hơn một chút”; mục 3 thì bạn khó dùng nếu không phải lập trình viên.1Bạn gặp nó ở đâuWhere you meet it Không nhớ tên lệnh thì tra theo từ khoá:man -k sort. Trùng tên ở nhiều mục thì chèn số mục vào trước tên trang —man 5 passwdđọc mô tả tệp/etc/passwdchứ không phải lệnhpasswd.18 Quên tên lệnh thì gõman -krồi từ khoá. If you don't recall the name, search by keyword:man -k sort. When a name appears in several sections, insert the section number before the page name —man 5 passwdreads the/etc/passwdfile description rather than thepasswdcommand.18Ba nguồn trợ giúp khác
Thứ nhất, thêm
--helphoặc-hsau tên lệnh — tuỳ chọn này khác nhau tuỳ lệnh, và bạn có thể nhận một cơn lũ như vớils --help.1 Thứ hai, Dự án GNU “quyết định rằng họ không thích trang man lắm” và chuyển sang định dạng info (hay texinfo):info command; tài liệu này thường đi xa hơn trang man nhưng cũng phức tạp hơn — không thích trình đọc info thì nối sangless.19 Thứ ba, một số gói đổ tài liệu vào/usr/share/docmà không đếm xỉa tới man hay info.1Học một trình soạn thảo
Ward nói thẳng: muốn nghiêm túc với Unix, bạn phải sửa được tệp văn bản mà không làm hỏng chúng, vì phần lớn hệ thống dùng tệp cấu hình văn bản thuần (như các tệp trong
/etc).1 Ông khuyên chọn một trong hai trình soạn thảo chuẩn trên thực tế là vi và Emacs, và dặn: “hầu hết các cao thủ Unix đều cuồng tín về lựa chọn trình soạn thảo, nhưng đừng nghe họ. Hãy tự chọn.” Tiêu chí của ông rất gọn: muốn một trình làm được gần như mọi thứ với trợ giúp trực tuyến phong phú và không ngại gõ thêm thì chọn Emacs; nếu tốc độ là tất cả thì thử vi.1
Cụm khái niệm 03 Concept cluster 03
Lỗi, tiến trình, quyền, và bản đồ cây thư mục Lỗi, chương trình đang chạy, và các thư mục Errors, processes, permissions, and the map of the hierarchy
Nửa sau của chương chuyển từ “gõ thế nào” sang “hệ thống trả lời thế nào”. Ward mổ xẻ một thông điệp lỗi Unix thành ba thành phần, rồi dẫn bạn qua tiến trình, tín hiệu, quyền tệp, nén và đóng gói, và cuối cùng là bản đồ thư mục gốc.1
Nửa sau của chương nói về chuyện máy trả lời bạn. Máy báo lỗi thì đọc lỗi. Máy đang chạy chương trình thì xem danh sách. Máy không cho đụng vào tệp thì xem quyền. Và cuối cùng: thư mục nào chứa gì. Nhớ nhé: nghe máy nói rồi hãy sửa.
The second half of the chapter shifts from "how you type" to "how the system answers." Ward dissects a Unix error message into three components, then walks you through processes, signals, file permissions, archiving and compression, and finally the map of the root directory.1
Ông cũng nói vì sao phần lỗi lại quan trọng hơn vẻ ngoài của nó: khá nhiều lỗi bạn gặp trong chương trình Unix bắt nguồn trực tiếp từ các điều kiện mà lời gọi hệ thống của nhân gặp phải — vậy nên nhìn vào chúng, bạn học được đôi chút về cách nhân gửi vấn đề ngược về cho tiến trình.1 Đây lại là cái cửa sổ nhìn xuống tầng nhân mà Chương 1 đã dựng.
Định nghĩa. Mỗi tệp Unix có một tập quyền (permissions) quyết định bạn có thể đọc, ghi, hay chạy tệp đó không; ls -l hiển thị chúng. Chế độ (mode) của tệp biểu diễn các quyền đó cùng vài thông tin bổ sung, và gồm bốn phần: loại tệp, rồi quyền của người dùng, của nhóm, và của những người còn lại.1
Nói đơn giản. Mỗi tệp có một tấm biển nhỏ ghi ai được xem, ai được sửa, ai được chạy. ls -l cho bạn xem tấm biển đó. Nhớ nhé: chủ tệp — nhóm — người ngoài, theo đúng thứ tự.
Definition. Every Unix file has a set of permissions that determine whether you can read, write, or run it; ls -l displays them. The file's mode represents those permissions plus some extra information, and has four parts: the file type, then the user, group, and other permissions.1
-rw-r--r--
│└┬┘└┬┘└┬┘
│ │ │ └ other
│ │ └ group
│ └ user
└ loại tệp (- thường, d thư mục, l liên kết)
- rw- r-- r--
loại | chủ | nhóm | người ngoài
r = đọc, w = sửa, x = chạy
-rw-r--r--
│└┬┘└┬┘└┬┘
│ │ │ └ other
│ │ └ group
│ └ user
└ file type (- regular, d directory, l symlink)
-
error message · ENOENT
Giải phẫu một thông điệp lỗi — và quy tắc “sửa lỗi đầu tiên trước” Đọc lỗi: ai, cái gì, sao lại thế The anatomy of an error message — and "address the first error first"
Ward tách dòng
ls: cannot access /dsafsda: No such file or directorythành ba thành phần: tên chương trình (ls) — có chương trình bỏ qua phần này, hơi phiền khi viết script nhưng không nghiêm trọng; tên tệp (/dsafsda) — mẩu thông tin cụ thể hơn, đường dẫn này có vấn đề; và bản thân lỗi (No such file or directory) — chỉ ra vấn đề với tên tệp đó. Ghép lại: “lsđã thử mở/dsafsdanhưng không được vì nó không tồn tại”.1Một dòng lỗi thường có ba phần: ai than phiền, than phiền về cái gì, và vì sao. Đọc đủ ba phần là bạn biết phải sửa gì. Nhớ nhé: ai — cái gì — vì sao.
Ward splits
ls: cannot access /dsafsda: No such file or directoryinto three components: the program name (ls) — some programs omit it, which is annoying in shell scripts but not a big deal; the filename (/dsafsda), a more specific piece of information, marking the path that has a problem; and the error itself (No such file or directory), which indicates the problem with that filename. Together: "lstried to open/dsafsdabut couldn't because it doesn't exist."1Bạn gặp nó ở đâuWhere you meet it Quy tắc gỡ lỗi của Ward: luôn xử lý lỗi đầu tiên trước. Một số chương trình báo rằng chúng không làm được gì cả rồi mới tuôn ra một loạt vấn đề khác — với ví dụ giả địnhscumd: cannot access /etc/scumd/config, “đừng để những lỗi kia làm bạn xao nhãng; bạn có lẽ chỉ cần tạo/etc/scumd/config”.1 Thấy một màn hình đầy lỗi thì đọc dòng đầu tiên thôi. Ward's debugging rule: always address the first error first. Some programs report that they can't do anything before reporting a host of other problems — with his fictitiousscumd: cannot access /etc/scumd/config, "don't let those other errors distract you. You probably just need to create/etc/scumd/config."1Lỗi số một
No such file or directory là lỗi phổ biến nhất; vì hệ thống I/O tệp của Unix không phân biệt nhiều giữa tệp và thư mục nên thông điệp này bao cả hai trường hợp. Ward cho biết nó cũng được gọi là ENOENT, viết tắt của “Error NO ENTity”, và thường là kết quả của
open()trả về ENOENT — xem trangopen(2)để biết thêm các lỗi nó có thể gặp.110Cảnh báo không phải lỗi
Ward dặn đừng lẫn lộn: cảnh báo thường trông giống lỗi nhưng có chứa chữ warning, và thường nghĩa là có gì đó sai nhưng chương trình vẫn cố chạy tiếp.1 Ông cũng liệt kê một chùm lỗi thường gặp khác: File exists, Not a directory / Is a directory, No space left on device (hết dung lượng đĩa), Permission denied, Operation not permitted (thường xảy ra khi bạn cố kết thúc một tiến trình không thuộc về mình), và Segmentation fault / Bus error.111
Lỗi phân đoạn nói gì về ai
Ward diễn giải rất thẳng: một segmentation fault về cơ bản nghĩa là người viết chương trình bạn vừa chạy đã làm sai ở đâu đó — chương trình cố truy cập một phần bộ nhớ mà nó không được phép chạm vào, và hệ điều hành đã kết liễu nó. Ông thêm rằng bạn có thể đang đưa cho chương trình một đầu vào nó không ngờ tới, và trong trường hợp hiếm, có thể là phần cứng bộ nhớ hỏng.1
-
ps · PID
ps— năm cột và một cái bẫy thời gian Xem máy đang chạy những gìps— five columns and one time-related trapMỗi tiến trình trên hệ thống có một mã số tiến trình (PID) dạng số; gõ
psđể liệt kê nhanh. Các cột: PID — mã tiến trình; TTY — thiết bị terminal nơi tiến trình chạy; STAT — trạng thái tiến trình, tức nó đang làm gì và bộ nhớ của nó nằm đâu (Slà đang ngủ,Rlà đang chạy); TIME — lượng thời gian CPU tính bằng phút và giây mà tiến trình đã dùng; và COMMAND — lệnh dùng để chạy chương trình.112Gõ
psđể xem máy đang chạy những gì. Mỗi chương trình đang chạy có một cái số riêng gọi là PID — giống số thứ tự khi bạn xếp hàng. Nhớ nhé: muốn nói chuyện với một chương trình, phải biết số của nó.Each process on the system has a numeric process ID (PID); run
psfor a quick listing. The fields: PID — the process ID; TTY — the terminal device where the process runs; STAT — the process status, what it's doing and where its memory resides (Smeans sleeping,Rmeans running); TIME — the CPU time in minutes and seconds the process has used so far; and COMMAND — the command used to run the program.112Hai cái bẫy Ward gỡ ngay tại chỗ. Thứ nhất, TIME không phải thời gian đồng hồ: vì tiến trình không chạy liên tục, tổng thời gian thực thi lệnh trên bộ xử lý khác hẳn khoảng thời gian kể từ lúc tiến trình khởi động.1 Thứ hai, COMMAND không đáng tin tuyệt đối: một tiến trình có thể tự thay đổi trường này so với giá trị gốc, và vì shell đã mở rộng glob nên trường này phản ánh lệnh đã mở rộng chứ không phải cái bạn gõ.1 Ông cũng ghi chú rằng PID là duy nhất cho mỗi tiến trình đang chạy, nhưng sau khi một tiến trình kết thúc, nhân cuối cùng có thể tái sử dụng PID đó cho tiến trình mới.1
Bạn gặp nó ở đâuWhere you meet it Ward dùng kiểu tuỳ chọn BSD trong cả sách:ps xhiện mọi tiến trình của bạn,ps axhiện mọi tiến trình trên hệ thống,ps uthêm thông tin chi tiết,ps whiện tên lệnh đầy đủ; ghép lại thànhps auxhayps auxw.1ps axđể xem toàn bộ,ps auxđể xem kỹ hơn. Ward uses the BSD option style throughout the book:ps xshows all of your processes,ps axall processes on the system,ps uadds detail,ps wshows full command names; combine them intops auxorps auxw.1 -
signal · kill
Tín hiệu —
killkhông phải “giết”, mà là “gửi một lời nhắn”killlà gửi lời nhắn, không phải đập vỡ Signals —killdoesn't kill; it sends a messageĐể kết thúc một tiến trình, bạn gửi cho nó một tín hiệu — theo định nghĩa của Ward, “một thông điệp từ nhân gửi tới một tiến trình” — bằng lệnh
kill. Mặc định là TERM (terminate). Bạn gửi tín hiệu khác bằng cách thêm tuỳ chọn:kill -STOP pidđóng băng tiến trình thay vì kết thúc nó — tiến trình bị dừng vẫn nằm trong bộ nhớ, sẵn sàng chạy tiếp từ chỗ dừng — vàkill -CONT pidcho nó chạy tiếp.113Lệnh tên là
killnhưng thật ra nó chỉ gửi một lời nhắn. Lời nhắn mặc định là “dọn dẹp rồi nghỉ nhé”. Có lời nhắn khác là “tạm đứng yên” và “chạy tiếp đi”. Nhớ nhé: kill là gửi tin, không phải đập phá.To terminate a process you send it a signal — in Ward's definition, "a message to a process from the kernel" — with the
killcommand. The default is TERM (terminate). You send other signals by adding an option:kill -STOP pidfreezes a process rather than terminating it — a stopped process is still in memory, ready to pick up where it left off — andkill -CONT pidcontinues it.113Bạn gặp nó ở đâuWhere you meet it Ward ghi chú rằng dùng CTRL-C để kết thúc một tiến trình đang chạy trong terminal hiện tại giống hệt việc dùngkillgửi tín hiệu INT (interrupt).1 Bấm CTRL-C cũng chính là gửi một lời nhắn như vậy. Ward notes that using CTRL-C to terminate a process running in the current terminal is the same as usingkillto send the INT (interrupt) signal.1Vì sao KILL là phương án cuối
Nhân cho phần lớn tiến trình một cơ hội tự dọn dẹp khi nhận tín hiệu, qua cơ chế signal handler. Nhưng một số tiến trình có thể chọn hành động không kết thúc, mắc kẹt khi xử lý, hoặc đơn giản là phớt lờ. Khi đó, cách tàn bạo nhất là tín hiệu KILL: khác mọi tín hiệu khác, KILL không thể bị phớt lờ — hệ điều hành thậm chí không cho tiến trình một cơ hội nào; nhân chấm dứt tiến trình và cưỡng chế gỡ nó khỏi bộ nhớ. Ward dặn: chỉ dùng cách này như biện pháp cuối cùng.113
Vì sao người ta gõ
kill -9Ward giải thích: nhân dùng số để chỉ các tín hiệu khác nhau, nên bạn có thể gọi tín hiệu bằng số nếu biết số đó —
kill -9chính làkill -KILL. Muốn tra ánh xạ số sang tên, chạykill -l.113 Ông cũng khuyên đừng kết liễu tiến trình một cách bừa bãi, nhất là khi không biết chúng đang làm gì — “bạn có thể đang tự bắn vào chân mình”.1Điều khiển công việc và tiến trình nền
Shell hỗ trợ điều khiển công việc (job control): gửi TSTP (gần giống STOP) bằng CTRL-Z rồi khởi động lại bằng
fghoặcbg.1 Ward có quan điểm rõ ràng về nó: “điều khiển công việc không cần thiết và có thể gây rối cho người mới” — người dùng hay bấm nhầm CTRL-Z thay vì CTRL-C rồi quên mất mình đang chạy gì.1 Muốn chạy nhiều chương trình, ông khuyên mỗi chương trình một cửa sổ terminal, đẩy các tiến trình không tương tác xuống nền bằng dấu&, và học dùngscreencùngtmux.1 Mặt trái của tiến trình nền: nếu nó cố đọc từ đầu vào chuẩn, nó có thể bị treo (thửfgđể kéo về) hoặc kết thúc; cách tốt nhất để nó không quấy rầy bạn là chuyển hướng đầu ra của nó.1 -
file mode · chmod · umask
Quyền tệp — ba bộ, ba bit, và sai lầm phổ biến với thư mục Ai được xem, ai được sửa, ai được chạy File permissions — three sets, three bits, and the classic directory mistake
Ký tự đầu tiên của chế độ là loại tệp: dấu gạch ngang (
-) là tệp thường — chỉ là dữ liệu nhị phân hoặc văn bản, không có gì đặc biệt — còndlà thư mục.1 Phần còn lại chia thành ba bộ theo đúng thứ tự: người dùng (chủ tệp), nhóm, và những người còn lại — đôi khi gọi là quyền “thế giới”. Mỗi bộ có bốn biểu diễn cơ bản:rđọc được,wghi được,xchạy được (bạn có thể chạy nó như một chương trình), và-nghĩa là “không gì cả” — quyền cho ô đó chưa được cấp.1Tấm biển trên tệp chia làm ba phần bằng nhau: phần của chủ, phần của nhóm, phần của người ngoài. Mỗi phần có ba ô: đọc, sửa, chạy. Ô nào là dấu gạch thì nghĩa là không được. Nhớ nhé: r là đọc, w là sửa, x là chạy.
The first character of the mode is the file type: a dash (
-) is a regular file — just binary or text data, nothing special about it — anddis a directory.1 The rest breaks into three sets in this order: user (the owner), group, and other — sometimes called world permissions. Each set has four basic representations:rreadable,wwritable,xexecutable (you can run it as a program), and-meaning "nothing" — the permission for that slot has not been granted.1Mỗi ô đọc, ghi, chạy đôi khi được gọi là một bit quyền, vì biểu diễn bên dưới trong hệ điều hành là một chuỗi bit — nên bạn sẽ nghe người ta nói “các bit đọc”.1 Có một ngoại lệ đáng nhớ: một số tệp thực thi có chữ
sở vị trí quyền người dùng thay vìx, nghĩa là tệp đó setuid — khi bạn chạy chương trình, nó chạy như thể chủ tệp là người dùng chứ không phải bạn. Ward nêu đúng ví dụ kinh điển: chương trìnhpasswd, vốn cần sửa tệp/etc/passwd.114Bạn gặp nó ở đâuWhere you meet it Dùngchmod: chọn bộ quyền cần đổi rồi chọn bit. Thêm quyền đọc cho nhóm và thế giới:chmod g+r filevàchmod o+r file, hoặc gộpchmod go+r file; gỡ đi thì dùnggo-r.115 Muốn cho người khác xem tệp thìchmod go+r. Usechmod: pick the set of permissions to change, then pick the bit. To add read for group and world:chmod g+r fileandchmod o+r file, or in one shotchmod go+r file; to remove, usego-r.115Chế độ tuyệt đối bằng số
chmod 644 filelà một thay đổi tuyệt đối: nó đặt tất cả các bit quyền cùng một lúc. Để hiểu, bạn cần biết biểu diễn bit quyền ở dạng bát phân — mỗi chữ số là một số cơ số 8 từ 0 đến 7, tương ứng một bộ quyền.115 Ward nói bạn không thật sự cần biết cách dựng chế độ tuyệt đối — chỉ cần thuộc những chế độ hay dùng. Bảng 2-4 của ông liệt kê: 644 (chủ đọc/ghi; nhóm và người khác đọc — cho tệp), 600 (chủ đọc/ghi; còn lại không gì — cho tệp), 755 (chủ đọc/ghi/chạy; còn lại đọc/chạy — cho thư mục và chương trình), 700 (chủ đọc/ghi/chạy; còn lại không gì), và 711 (chủ đọc/ghi/chạy; còn lại chạy — cho thư mục).1Sai lầm kinh điển với thư mục
Thư mục cũng có quyền. Bạn liệt kê được nội dung thư mục nếu nó đọc được, nhưng chỉ truy cập được một tệp bên trong nếu thư mục chạy được. Hầu hết trường hợp bạn cần cả hai — và Ward chỉ đúng sai lầm phổ biến: vô tình gỡ mất quyền thực thi khi dùng chế độ tuyệt đối.1
umask— quyền mặc địnhLệnh shell
umaskđặt một tập quyền mặc định áp cho mọi tệp mới bạn tạo. Ward đưa quy tắc thực dụng: dùngumask 022nếu muốn mọi người đều thấy được tệp và thư mục bạn tạo, vàumask 077nếu không muốn. Muốn hiệu lực cho các cửa sổ và phiên sau, đặt lệnhumaskvới chế độ mong muốn vào một trong các tệp khởi động — chủ đề của Chương 13.116 -
symbolic link · ln -s
Liên kết tượng trưng — sức mạnh đi kèm một danh sách cạm bẫy Lối tắt trỏ tới chỗ khác Symbolic links — power that comes with a list of traps
Một liên kết tượng trưng là một tệp trỏ tới tệp hoặc thư mục khác, tạo ra một bí danh — Ward so sánh với lối tắt trong Windows. Trong danh sách dài, liên kết tượng trưng có
lở ô loại tệp:lrwxrwxrwx 1 ruser users 11 Feb 27 13:52 somedir -> /home/origdir. Tạo bằngln -s target linkname, trong đó linkname là tên liên kết, target là đường dẫn đích, và cờ-schỉ định liên kết tượng trưng.117Liên kết tượng trưng là một tấm biển chỉ đường: nó không chứa gì cả, chỉ ghi “đi lối kia”. Bạn mở nó thì máy dẫn bạn tới chỗ thật. Tạo bằng
ln -s. Nhớ nhé: nó là tấm biển, không phải căn phòng.A symbolic link is a file that points to another file or directory, effectively creating an alias — Ward compares it to a Windows shortcut. In a long listing, symlinks carry an
lin the file-type slot:lrwxrwxrwx 1 ruser users 11 Feb 27 13:52 somedir -> /home/origdir. Create one withln -s target linkname, where linkname is the link's name, target is the path it points to, and the-sflag specifies a symbolic link.117Bạn gặp nó ở đâuWhere you meet it Trường hợp dùng phổ biến Ward nêu: một chương trình mong tìm thấy một tệp hay thư mục cụ thể vốn đã tồn tại ở nơi khác trên hệ thống; bạn không muốn sao chép và cũng không sửa được chương trình, nên chỉ cần tạo một liên kết tượng trưng tới vị trí thật.1 Khi một chương trình đòi tệp ở chỗ A nhưng tệp lại nằm ở chỗ B. Ward's common use case: a program expects to find a particular file or directory that already exists elsewhere on your system; you don't want a copy and can't change the program, so you create a symbolic link to the actual location.1Bốn cách để bị lừa
Một, đích không cần tồn tại: nếu
/home/origdirkhông có thật, mọi chương trình truy cậpsomedirsẽ báo lỗi rằngsomedirkhông tồn tại — trừls somedir, lệnh mà theo lời Ward “ngớ ngẩn báo cho bạn biết rằngsomedirlàsomedir”; điều này rất khó hiểu vì bạn đang nhìn thấysomedirngay trước mắt.1 Hai, bạn không thể biết đặc điểm của đích chỉ bằng cách nhìn tên liên kết — phải đi theo nó mới biết là tệp hay thư mục. Ba, có thể có liên kết trỏ tới liên kết khác, gọi là liên kết tượng trưng xâu chuỗi. Bốn, bạn có thể tưởng đang sửa một bản sao trong khi thực ra đang sửa chính bản gốc qua một liên kết.1Đừng quên cờ
-sCảnh báo nghiêm khắc nhất của mục này: không có
-s,lntạo một liên kết cứng (hard link), tức thêm một tên tệp thật nữa cho cùng một tệp; tên mới có địa vị ngang tên cũ và trỏ thẳng vào dữ liệu tệp thay vì trỏ tới một tên khác. Ward nói liên kết cứng còn dễ gây rối hơn liên kết tượng trưng, và khuyên tránh dùng cho tới khi bạn hiểu tài liệu ở Mục 4.6.117 Ông cũng cảnh báo trường hợp đảo thứ tự đối số: nếu linkname là một thư mục đã tồn tại,lnsẽ tạo một liên kết tên target bên trong nó, và liên kết ấy trỏ vào chính nó.1 -
tar · gzip · zcat
Đóng gói và nén — hai việc khác nhau, làm bằng hai công cụ khác nhau Gói lại và ép nhỏ là hai việc Archiving and compressing — two different jobs, two different tools
Ward chỉ ra điểm khác biệt so với các chương trình ZIP trên hệ điều hành khác:
gzipkhông tạo kho lưu trữ — nó không gói nhiều tệp và thư mục vào một tệp duy nhất.gzip(GNU Zip) là một trong những chương trình nén chuẩn hiện hành của Unix; tệp kết thúc bằng.gzlà một kho GNU Zip. Dùnggunzip file.gzđể giải nén và bỏ hậu tố,gzip fileđể nén lại. Muốn gói thì dùngtar.118Có hai việc khác nhau: gói nhiều thứ vào một túi, và ép cho túi nhỏ lại.
tarlo việc gói.gziplo việc ép. Người ta hay làm cả hai nên mới có tên.tar.gz. Nhớ nhé: tar gói, gzip ép.Ward flags the difference from ZIP programs on other operating systems:
gzipdoes not create archives — it doesn't pack multiple files and directories into a single file.gzip(GNU Zip) is one of the current standard Unix compression programs; a file ending in.gzis a GNU Zip archive. Usegunzip file.gzto uncompress and drop the suffix,gzip fileto compress again. To archive, usetar.118Ba cờ trong
tar cvf archive.tar file1 file2 ...mang ba vai trò riêng:ckích hoạt chế độ tạo;vbật đầu ra chẩn đoán chi tiết, khiếntarin tên tệp và thư mục khi gặp — thêm một chữvnữa thì nó in cả kích thước và quyền;flà tuỳ chọn tệp, và đối số ngay saufphải là tệp kho màtarsẽ tạo. Ward nhấn mạnh bạn phải luôn dùng tuỳ chọn này kèm một tên tệp, trừ khi làm việc với ổ băng từ; muốn dùng đầu vào/ra chuẩn thì đặt tên tệp là một dấu gạch ngang (-).119Bạn gặp nó ở đâuWhere you meet it Giải nén một kho nén, làm từ phải sang trái: bỏ.gztrước, rồi mới lo.tar—gunzip file.tar.gzrồitar xvf file.tar. Tạo kho nén thì làm ngược lại:tartrước,gzipsau.1 Mở gói nén: cởi lớp ép trước, mở túi sau. To unpack a compressed archive, work right to left: get rid of the.gzfirst, then worry about the.tar—gunzip file.tar.gzthentar xvf file.tar. To create one, do the reverse:tarfirst,gzipsecond.1Chế độ mục lục — thói quen an toàn
Trước khi giải nén, Ward khuyên kiểm tra nội dung tệp
.tarbằng chế độ mục lục, dùng cờtthay chox. Chế độ này xác minh tính toàn vẹn cơ bản của kho và in tên mọi tệp bên trong; không kiểm tra trước thì bạn có thể đổ một mớ hỗn độn khổng lồ vào thư mục hiện tại, rất khó dọn.1 Tiêu chí kiểm tra: mọi đường dẫn trong kho nên bắt đầu từ cùng một thư mục; nếu không chắc, tạo một thư mục tạm, chuyển vào đó, rồi mới giải nén.1Giữ nguyên quyền khi giải nén
Cân nhắc tuỳ chọn
pđể bảo toàn quyền: dùng nó ở chế độ giải nén để ghi đèumaskcủa bạn và lấy đúng quyền ghi trong kho;plà mặc định khi bạn làm việc với tư cách siêu người dùng. Ward giải thích một chi tiết cơ chế quan trọng: dù chỉ muốn lấy một phần nhỏ,tarvẫn phải chạy hết kho, và bạn không được ngắt quá trình, vì nó chỉ đặt quyền sau khi đã kiểm tra toàn bộ kho.119Lối tắt
zvà những công cụ khácCách hai bước lãng phí dung lượng đĩa và thời gian I/O của nhân; gọn hơn là nối ống:
zcat file.tar.gz | tar xvf -, trong đózcattương đươnggunzip -dc(-dgiải nén,-cgửi kết quả ra đầu ra chuẩn).1 Vì lối này quá phổ biến, bảntarđi cùng Linux có lối tắt: cờztự gọigzip—tar ztvf file.tar.gzđể xác minh một kho nén.1 Ward cũng điểm tên các công cụ khác:xzvàbzip2(đuôi.xzvà.bz2, chậm hơngzipmột chút nhưng thường nén tệp văn bản gọn hơn, giải bằngunxzvàbunzip2);zip/unziptương thích với kho ZIP trên Windows; và đuôi.Zlà di vật của chương trìnhcompress—gunzipmở được nhưnggzipkhông tạo ra.1 Một ghi chú nhỏ: tệp.tgzgiống hệt.tar.gz, hậu tố này để vừa với hệ thống tệp FAT.1 -
FHS · /usr · /var
Cây thư mục — bản đồ nhỏ của một hệ thống lớn Thư mục nào chứa gì The directory hierarchy — a small map of a large system
Chi tiết cấu trúc thư mục Linux được phác thảo trong Filesystem Hierarchy Standard (FHS), nhưng Ward nói một lượt đi dạo ngắn là đủ cho lúc này.120 Các thư mục con quan trọng nhất trong gốc:
/binchứa chương trình sẵn sàng chạy, gồm hầu hết lệnh Unix cơ bản nhưlsvàcp;/devchứa tệp thiết bị (Chương 3);/etclà thư mục cấu hình hệ thống cốt lõi — Ward chỉ cả cách đọc: “EHT-see” — chứa mật khẩu người dùng, khởi động, thiết bị, mạng và các tệp thiết lập khác;/homegiữ thư mục cá nhân của người dùng thường;/libviết tắt của library, chứa tệp thư viện.1Cây thư mục giống một toà nhà có bảng chỉ dẫn:
/binlà kho công cụ,/etclà phòng hồ sơ,/homelà các căn hộ,/devlà phòng thiết bị,/varlà chỗ ghi nhật ký. Nhớ nhé: mỗi thư mục gốc có một nghề riêng.The details of the Linux directory structure are outlined in the Filesystem Hierarchy Standard (FHS), but Ward says a brief walkthrough suffices for now.120 The most important subdirectories in root:
/binholds ready-to-run programs, including most basic Unix commands such aslsandcp;/devholds device files (Chapter 3);/etcis the core system configuration directory — Ward even gives the pronunciation, "EHT-see" — containing the user password, boot, device, networking and other setup files;/homeholds home directories for regular users;/lib, short for library, holds library files.1Bạn gặp nó ở đâuWhere you meet it Hình 2-2 của sách vẽ cây rút gọn và làm lộ một điều dễ gây bối rối: cấu trúc dưới/usrlặp lại một số tên thư mục có trong/—/usr/bin,/usr/lib,/usr/sbin— và chúng giữ cùng loại tệp.1 Bạn sẽ thấybinvàlibxuất hiện hai lần — đó là bình thường. The book's Figure 2-2 draws the abbreviated tree and exposes something confusing: the structure under/usrrepeats several directory names found in/—/usr/bin,/usr/lib,/usr/sbin— holding the same kinds of files.1Phần còn lại của gốc
/proccung cấp thống kê hệ thống qua một giao diện thư mục-và-tệp duyệt được, chứa thông tin về các tiến trình đang chạy cùng vài tham số nhân.121/runchứa dữ liệu thời gian chạy riêng của hệ thống — một số PID, tệp socket, bản ghi trạng thái, và trong nhiều trường hợp là nhật ký hệ thống; đây là phần bổ sung tương đối mới, ở hệ cũ nó nằm ở/var/run, còn ở hệ mới/var/runlà một liên kết tượng trưng tới/run.1/systương tự/proc, cung cấp giao diện thiết bị và hệ thống (Chương 3).1/sbinlà chỗ của tệp thực thi hệ thống: chương trình ở đây liên quan tới quản trị, nên người dùng thường không có/sbintrong đường dẫn lệnh, và nhiều tiện ích ở đây không chạy nếu không phải root.1/tmplà kho tệp tạm nhỏ mà bạn không quan tâm lắm: ai cũng đọc/ghi được, nhưng có thể không có quyền chạm vào tệp của người khác; đừng để thứ cực kỳ quan trọng ở đó vì hầu hết bản phân phối xoá/tmpkhi máy khởi động.1/varlà thư mục con “biến thiên”, nơi chương trình ghi thông tin thay đổi theo thời gian: nhật ký hệ thống, theo dõi người dùng, bộ nhớ đệm — và có một/var/tmpmà hệ thống không xoá khi khởi động.1/usrđọc là “user” nhưng không có tệp người dùngWard gỡ ngay cái tên gây hiểu nhầm: dù đọc là “user”, thư mục con này không chứa tệp người dùng — nó chứa một cây thư mục lớn gồm phần lớn hệ thống Linux. Lý do thư mục gốc không chứa trọn hệ thống chủ yếu mang tính lịch sử: trước kia người ta muốn giữ yêu cầu dung lượng cho gốc ở mức thấp.1 Bên trong
/usr:/includegiữ tệp header cho trình biên dịch C;/locallà nơi quản trị viên cài phần mềm của riêng họ, với cấu trúc nên giống/và/usr;/manchứa trang hướng dẫn;/sharechứa các tệp chạy được trên nhiều loại máy Unix khác mà không mất chức năng.1Ba thư mục gốc còn lại, và nhân nằm ở đâu
/bootchứa tệp của trình nạp khởi động nhân — chỉ thuộc giai đoạn đầu tiên của quy trình khởi động, nên bạn sẽ không tìm thấy ở đây thông tin về cách Linux khởi động các dịch vụ của nó (Chương 5)./medialà điểm gắn cơ sở cho phương tiện tháo rời như ổ flash./optcó thể chứa phần mềm bên thứ ba bổ sung — Ward ghi rõ “nhiều hệ thống không dùng/opt”.1 Còn nhân: trên hệ Linux, nhân thường là một tệp nhị phân/vmlinuzhoặc/boot/vmlinuz; trình nạp khởi động nạp nó vào bộ nhớ và khởi động nó. Sau khi nhân chạy, tệp nhân chính không còn được hệ thống đang chạy dùng nữa — nhưng có nhiều mô-đun nhân nạp được mà nhân nạp và gỡ theo nhu cầu, nằm dưới/lib/modules.1 -
sudo · /etc/sudoers
sudo— vì sao mở một shell root là ý tồi Mượn quyền cao, từng lệnh mộtsudo— why starting a root shell is a bad ideaWard liệt kê thẳng bốn bất lợi của việc mở một shell root: bạn không có bản ghi các lệnh làm thay đổi hệ thống; bạn không có bản ghi ai đã thực hiện chúng; bạn không có môi trường shell bình thường của mình; và bạn phải nhập mật khẩu root (nếu có).1 Thay vào đó, hầu hết bản phân phối dùng gói
sudo, cho phép quản trị viên chạy lệnh với tư cách root trong khi vẫn đăng nhập bằng chính tài khoản của mình.122Đừng biến mình thành ông chủ suốt cả buổi. Hãy mượn quyền đúng một lệnh, rồi trả lại. Đó là việc của
sudo. Làm vậy thì máy còn ghi lại ai đã làm gì. Nhớ nhé: mượn từng lệnh, đừng mượn cả ngày.Ward lists the four disadvantages of starting a root shell outright: you have no record of system-altering commands; no record of the users who performed them; no access to your normal shell environment; and you have to enter the root password (if you have one).1 Instead, most distributions use the
sudopackage, which lets administrators run commands as root while logged in as themselves.122Bạn gặp nó ở đâuWhere you meet it Khi bạn chạy một lệnh nhưsudo vipw,sudoghi lại hành động đó qua dịch vụ syslog dưới nhómlocal2. Xem nhật ký trên hầu hết hệ thống bằngjournalctl SYSLOG_IDENTIFIER=sudo; hệ cũ hơn thì tìm tệp nhật ký trong/var/log, chẳng hạn/var/log/auth.log.1 Máy ghi lại mọi lần bạn mượn quyền — đó là điều tốt. When you run a command such assudo vipw,sudologs the action with the syslog service under thelocal2facility. Read the logs on most systems withjournalctl SYSLOG_IDENTIFIER=sudo; on older systems, look for a logfile in/var/log, such as/var/log/auth.log.1Ba chữ ALL nghĩa là gì
Người dùng có đặc quyền được cấu hình trong tệp
/etc/sudoers. Ward giải thích từng phần của ví dụ mà ông đưa ra. DòngUser_Alias ADMINS = user1, user2định nghĩa một bí danh người dùng gồm hai người; dòngADMINS ALL = NOPASSWD: ALLcấp đặc quyền — chữ ALL thứ hai nghĩa là “bất kỳ lệnh nào”, chữ ALL thứ nhất nghĩa là “bất kỳ máy chủ nào”. Dòngroot ALL=(ALL) ALLnghĩa là siêu người dùng cũng có thể dùngsudođể chạy bất kỳ lệnh nào trên bất kỳ máy nào, và phần(ALL)thêm vào nghĩa là có thể chạy lệnh với tư cách bất kỳ người dùng nào khác.122Đừng sửa
/etc/sudoersbằng tayWard ghi chú dứt khoát: dùng lệnh
visudođể sửa/etc/sudoers, vì lệnh này kiểm tra lỗi cú pháp sau khi bạn lưu.122 Ông cũng thừa nhận góisudocó rất nhiều tuỳ chọn “mà bạn có lẽ sẽ không bao giờ dùng”, khiến cú pháp trong/etc/sudoershơi phức tạp; cần tính năng nâng cao thì xem trangsudoers(5)vàsudo(8).1
Đính chính Corrections
Bốn ngộ nhận mà người đọc lần đầu hay mắc Bốn chỗ hay hiểu nhầm Four misconceptions first readers hit
Phần này thuộc mức đọc Đầy đủ: nó đối chiếu điều người đọc thường nghĩ với điều bản văn thật sự nói.
Phần này hơi khó, bạn có thể bỏ qua và quay lại sau. Nhớ nhé: hiểu chậm mà chắc vẫn hơn.
This block belongs to the Đầy đủ (full) reading level: it sets what readers usually assume against what the text actually says.
“Chương trình tự xử lý dấu sao trong tên tệp” "The program handles the star in the filename itself"
Ngộ nhận: khi bạn gõ rm *.txt, chính rm là thứ hiểu dấu sao.
Bản văn nói: shell khớp các đối số chứa glob với tên tệp, thay thế tên tệp vào đó, rồi mới chạy dòng lệnh đã sửa; và shell thực hiện mở rộng trước khi chạy lệnh, chỉ khi đó thôi. Nếu một dấu sao lọt tới lệnh mà chưa được mở rộng, shell không làm gì thêm — tuỳ lệnh quyết định.1 Đây chính là lý do find đòi bạn bao mẫu trong nháy đơn ('*') để bảo vệ ký tự đặc biệt khỏi tính năng glob của shell.1
Misconception: when you type rm *.txt, it is rm that understands the star.
The text says: the shell matches arguments containing globs to filenames, substitutes them, and only then runs the revised command line; the shell performs expansions before running commands, and only then. If a star reaches a command unexpanded, the shell does nothing more with it — it's up to the command.1 This is exactly why find wants patterns in single quotes ('*'), to protect the special characters from the shell's own globbing.1
“* khớp mọi tệp, kể cả tệp cấu hình”
"* matches every file, config files included"
Ngộ nhận: dấu sao trơn là “tất cả”, nên sao lưu bằng cp * là đủ.
Bản văn nói: glob của shell không khớp tệp dấu chấm trừ khi bạn dùng tường minh mẫu như .* — mà mẫu đó lại khớp cả . và .., nên Ward gợi ý .[^.]* hoặc .??*.1 Thêm nữa, phản xạ *.* mang từ Windows sang là sai: trong shell Unix, *.* chỉ khớp những tên có chứa dấu chấm.1
Misconception: a bare star means "everything," so cp * is a sufficient backup.
The text says: shell globs do not match dot files unless you explicitly use a pattern such as .* — and that pattern also matches . and .., which is why Ward suggests .[^.]* or .??*.1 Also, the *.* reflex carried over from Windows is wrong: in the Unix shell, *.* matches only names that contain a dot.1
“kill là hành động huỷ diệt”
"kill is a destructive act"
Ngộ nhận: kill cưỡng chế chấm dứt tiến trình, nên kill -9 chỉ là cách làm việc đó “mạnh hơn”.
Bản văn nói: kill gửi một tín hiệu — một thông điệp từ nhân tới tiến trình; mặc định là TERM, và nhân cho phần lớn tiến trình một cơ hội tự dọn dẹp qua cơ chế signal handler. Chính vì vậy mà tiến trình có thể phớt lờ, mắc kẹt, hoặc chọn hành động không kết thúc.1 KILL mới là ngoại lệ: nó không thể bị phớt lờ, và Ward dặn chỉ dùng như biện pháp cuối cùng.113
Misconception: kill forcibly ends a process, so kill -9 is merely a "stronger" way to do the same thing.
The text says: kill sends a signal — a message to a process from the kernel; the default is TERM, and the kernel gives most processes a chance to clean up via the signal handler mechanism. That is precisely why a process can ignore it, get wedged, or choose a nonterminating action.1 KILL is the exception: it cannot be ignored, and Ward says to use it only as a last resort.113
“/usr là chỗ để tệp của người dùng”
"/usr is where user files live"
Ngộ nhận: tên đọc là “user”, vậy hẳn nó chứa dữ liệu người dùng.
Bản văn nói: dù đọc là “user”, thư mục con này không có tệp người dùng nào — nó chứa một cây thư mục lớn gồm phần lớn hệ thống Linux; tệp cá nhân nằm ở /home. Lý do thư mục gốc không chứa trọn hệ thống chủ yếu là lịch sử: giữ yêu cầu dung lượng cho gốc ở mức thấp.1
Misconception: it's pronounced "user," so it must hold user data.
The text says: although pronounced "user," this subdirectory has no user files — it contains a large directory hierarchy holding the bulk of the Linux system; personal files live in /home. The reason the root directory doesn't contain the complete system is primarily historic: keeping space requirements low for the root.1
Tự kiểm tra Self-check
Bạn đã cầm được bộ đồ nghề dòng lệnh chưa? Thử trả lời xem nào Do you have the command-line toolkit yet?
Trả lời bằng lời của bạn, không tra sách. Nếu một câu khiến bạn ngập ngừng, đó chính là mục bạn nên đọc lại.
Thử trả lời miệng thôi, không cần giở lại. Câu nào bí thì quay lại đọc phần đó nhé. Nhớ nhé: chỗ bí chính là chỗ cần học.
Answer in your own words, without looking back. Whichever question makes you hesitate points at the section you should reread.
-
Khi bạn gõ
echo *, ai là người biến dấu sao thành danh sách tên tệp — shell hayecho?Gợi ý sâu hơn: điều gì xảy ra nếu không tệp nào khớp?
-
Vì sao
cdbắt buộc phải là lệnh dựng sẵn của shell chứ không thể là một chương trình riêng?Gợi ý sâu hơn: hãy nói bằng ngôn ngữ tiến trình cha và tiến trình con.
-
Biến shell khác biến môi trường ở điểm nào, và lệnh nào chuyển loại này thành loại kia?
Gợi ý sâu hơn: ai thừa kế cái gì, và vì sao
LESSlại là một ví dụ hay? -
Sau
ls /fffffffff > f, vì sao tệpfrỗng mà màn hình vẫn có chữ?Gợi ý sâu hơn: con số trong
2> evà trong2>&1nghĩa là gì? -
Ba thành phần của một thông điệp lỗi Unix là gì, và quy tắc gỡ lỗi đi kèm là gì?
Gợi ý sâu hơn: ENOENT là viết tắt của cụm nào?
-
Vì sao cột TIME trong
pskhông phải là thời gian kể từ lúc tiến trình khởi động?Gợi ý sâu hơn: cột COMMAND có thể đánh lừa bạn theo hai cách nào?
-
killthật sự làm gì, và điều gì khiến tín hiệu KILL khác mọi tín hiệu còn lại?Gợi ý sâu hơn: cơ chế nào cho phép tiến trình phớt lờ một tín hiệu thường?
-
Đọc
-rw-r--r--: ký tự đầu nói gì, và ba nhóm còn lại thuộc về ai?Gợi ý sâu hơn: vì sao một thư mục cần cả bit đọc lẫn bit thực thi?
-
tarvàgziplàm hai việc khác nhau — việc nào là việc nào, và thứ tự khi giải nén.tar.gzra sao?Gợi ý sâu hơn: cờ
tdùng để làm gì trước khi bạn dùng cờx? -
Kể bốn bất lợi của việc mở một shell root thay vì dùng
sudo.Gợi ý sâu hơn: nên dùng lệnh nào để sửa
/etc/sudoers, và vì sao?
Shell là gì? Nó làm gì khi bạn gõ một câu lệnh?
Dấu
*nghĩa là gì, và ai là người hiểu nó?Chữ đi ra màn hình có mấy đường? Kể tên hai đường.
Dấu
>và dấu|khác nhau chỗ nào?Trên tấm biển
-rw-r--r--, ai được sửa tệp?tarlàm gì,gziplàm gì?Thư mục
/homechứa gì, còn/etcchứa gì?Vì sao nên dùng
sudothay vì làm root cả buổi?
-
When you type
echo *, who turns the star into a list of filenames — the shell orecho? -
Why must
cdbe a shell built-in rather than a separate program? -
How does a shell variable differ from an environment variable, and which command promotes one to the other?
-
After
ls /fffffffff > f, why isfempty while text still appears on screen? -
What are the three components of a Unix error message, and what debugging rule goes with them?
-
Why isn't the TIME column in
psthe time since the process started? -
What does
killactually do, and what makes the KILL signal different from all the others? -
Read
-rw-r--r--: what does the first character say, and to whom do the three groups belong? -
tarandgzipdo two different jobs — which is which, and in what order do you unpack a.tar.gz? -
Name the four disadvantages of starting a root shell instead of using
sudo.
Khép lại chương Closing the chapter
Chương này không bắt bạn thuộc lòng một danh sách lệnh; nó đặt vào tay bạn một ngữ pháp và một tấm bản đồ. Bạn chưa biết nhiều về chi tiết bên trong các thành phần không gian người dùng hay về những gì diễn ra trong nhân — nhưng với căn bản về tệp và tiến trình trong tay, bạn đang trên đường.1
Chương này không bắt bạn học thuộc. Nó đưa cho bạn một cách nói và một tấm bản đồ. Bạn chưa biết hết, nhưng biết về tệp và về chương trình đang chạy là đã đủ để đi tiếp. Nhớ nhé: mở máy ra gõ thử ngay hôm nay.1
This chapter doesn't ask you to memorise a list of commands; it puts a grammar and a map in your hands. You may not yet know much about the internal details of user-space components or what goes on in the kernel — but with the basics of files and processes under your belt, you're on your way.1