How Linux Works Chương 2 · Basic Commands and Directory Hierarchy

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

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 ...

  1. bash · /bin/sh

    bash — “Bourne-again shell”, và vì sao /bin/sh thườ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/sh is usually just a link

    Linux 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/sh thườ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.1

    Trên Linux, cái shell bạn gặp gần như luôn là bash. Cái tên /bin/sh thườ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/sh is normally a link to bash. Ward asks you to use bash when running the book's examples.1

    Bạ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ệnh chsh, 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 the chsh command, or asking your administrator.1

    Cá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”.

    Vì sao “tương thích sh” lại quan trọng

    Ngữ pháp mà mọi shell dòng Bourne chia nhau được chuẩn hoá thành Shell Command Language trong POSIX.3 Đó chính là lý do kỹ thuật cho lời hứa của Ward ở đầu chương: học ngữ pháp này một lần, mang được sang BSD và các hệ Unix khác.1

  2. 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à cat và 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.1

    Mộ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/passwd the program is cat and 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.1

    Bạ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.1

    Dấ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ạng name@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.1

    Một lệnh đầu tiên rất có chủ ý

    Lệnh cat /etc/passwd mà ô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ờ”.

  3. stdin · stdout

    Đầu vào chuẩn và đầu ra chuẩn — vì sao cat không đối số lại “nhại” bạn Chữ vào và chữ ra Standard input and output — why bare cat echoes you back

    Tiế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 cat khô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.1

    Mỗ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 cat mà 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 cat with 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.1

    Ward 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 as cat does: with no input file, they read from stdin. Output differs slightly — some programs (like cat) send output only to stdout, while others can write directly to files.1

    Vì sao lệnh tên là cat

    Ward 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.1

    Cò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 đó.

  4. 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.1

    Bì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.1

    Chiề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ành head /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/cpuinfo rồi head /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ó sang less để đọc từng trang. Ward suggests trying head /proc/cpuinfo and then head /proc/cpuinfo | tr a-z A-Z to see a pipe at work.1 Another example from the chapter: grep ie /usr/share/dict/words | less.1

    Chố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ọn noclobber nà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

  5. 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ệp f rỗng, nhưng dòng ls: cannot access /fffffffff: No such file or directory vẫn hiện trên màn hình.1

    Chươ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 file f ends up empty, yet ls: cannot access /fffffffff: No such file or directory still appears on the terminal.1

    Bạ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 >& notation: ls /fffffffff > f 2>&1.1

    Con số là mã luồng

    Ward nói rõ: con số 2 chỉ định mã luồng (stream ID) mà shell sẽ sửa. Mã 1 là đầu ra chuẩn — và là mặc định khi bạn viết > trơn — còn 2 là lỗi chuẩn.1

    Vì 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

  1. cd · shell built-in

    cd là lệnh dựng sẵn — và lý do thì rất sâu cd không phải một chương trình riêng cd is a shell built-in — and the reason runs deep

    Nế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: cd là 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.1

    cd trơn thì về nhà. Còn vì sao cd lạ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 dir argument 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: cd is 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.1

    Bạ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ấy cd bằng which. Khi bạn tìm mãi không thấy tệp cd ở đâ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 why which won't find cd.

    Hai lý do cần pwd

    Ward đưa đúng hai lý do vì sao vẫn cần pwd dù 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ùng pwd -P để xoá nhầm lẫn đó.1

    Xoá thư mục không rỗng

    rmdir thất bại nếu thư mục không rỗng; Ward chỉ cách dùng rm -r dir như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ờ -r chung 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

  2. 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 star

    Shell 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).1

    Dấ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.1

    Ward 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ằng at; *at thành mọi tên kết thúc bằng at; *at* thành mọi tên chứa at.1 Ký tự glob thứ hai là dấu hỏi (?), khớp đúng một ký tự tuỳ ý — b?at khớp boat và 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.1

    Bạn gặp nó ở đâuWhere you meet it Ward gọi echo là 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õ echo trước để xem shell hiểu thành cái gì. Ward calls echo very useful for finding the expansions of globs and variables — type echo * to print the files in the current directory.1

    Khi 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.1

    Thó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

    Khớp mẫu là một chuẩn, không phải nét riêng của bash

    Cú pháp khớp tên đường dẫn này được đặc tả trong trang glob(7) và trong chuẩn POSIX cho ngôn ngữ lệnh shell.43 Đó là lý do cùng một mẫu chạy được trên nhiều hệ Unix khác nhau.

  3. 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 ls rồi ls -a trong 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.1

    Tệp có tên bắt đầu bằng dấu chấm thì ls khô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 ls and then ls -a in your home directory and you'll see the difference: without -a you 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.1

    Bạ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 .*.1

    Mộ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ùng chsh, 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

  4. 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 PS1 trướ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.1

    Biế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 PS1 variable 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.1

    Bạ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ệnh export củ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's export command: export STUFF.1

    Mộ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.

    Vì sao thừa kế lại hữu ích

    Vì tiến trình con thừa kế biến môi trường từ cha, nhiều chương trình đọc chúng để lấy cấu hình và tuỳ chọn; ví dụ Ward đưa ra là đặt các tuỳ chọn less ưa thích vào biến LESS. Ông cũng chỉ chỗ tra: nhiều trang hướng dẫn có mục ENVIRONMENT mô tả các biến này.16

  5. PATH

    PATH — danh sách nơi shell đi tìm, theo thứ tự PATH — danh sách chỗ để tìm chương trình PATH — the list of places the shell searches, in order

    PATH là 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ạy ls, shell tìm chương trình ls trong 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.1

    PATH là 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.

    PATH is a special environment variable containing the command path: a list of system directories the shell searches when trying to locate a command. When you run ls, the shell searches the directories listed in PATH for the ls program. If programs with the same name appear in several directories in the path, the shell runs the first matching program.1

    Bạn gặp nó ở đâuWhere you meet it Chạy echo $PATH và 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. Run echo $PATH and you'll see the components separated by colons (:) — Ward's example is /usr/local/bin:/usr/bin:/bin.1

    Thê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

  6. man · info · --help

    Trợ giúp trực tuyến — trang man và 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 sections

    Vớ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.1

    Muốn biết một lệnh dùng thế nào thì gõ man rồ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.1

    Trang 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.1

    Bạ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/passwd chứ không phải lệnh passwd.18 Quên tên lệnh thì gõ man -k rồ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 passwd reads the /etc/passwd file description rather than the passwd command.18

    Ba nguồn trợ giúp khác

    Thứ nhất, thêm --help hoặc -h sau 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ới ls --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 sang less.19 Thứ ba, một số gói đổ tài liệu vào /usr/share/doc mà không đếm xỉa tới man hay info.1

    Họ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)

  1. 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 directory thà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ở /dsafsda nhưng không được vì nó không tồn tại”.1

    Mộ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 directory into 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: "ls tried to open /dsafsda but couldn't because it doesn't exist."1

    Bạ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ả định scumd: 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 fictitious scumd: cannot access /etc/scumd/config, "don't let those other errors distract you. You probably just need to create /etc/scumd/config."1

    Lỗ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 trang open(2) để biết thêm các lỗi nó có thể gặp.110

    Cả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

  2. 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 trap

    Mỗ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 (S là đang ngủ, R là đ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.112

    Gõ 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 ps for 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 (S means sleeping, R means running); TIME — the CPU time in minutes and seconds the process has used so far; and COMMAND — the command used to run the program.112

    Hai 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 x hiện mọi tiến trình của bạn, ps ax hiện mọi tiến trình trên hệ thống, ps u thêm thông tin chi tiết, ps w hiện tên lệnh đầy đủ; ghép lại thành ps aux hay ps auxw.1 ps ax để xem toàn bộ, ps aux để xem kỹ hơn. Ward uses the BSD option style throughout the book: ps x shows all of your processes, ps ax all processes on the system, ps u adds detail, ps w shows full command names; combine them into ps aux or ps auxw.1

    Ba phong cách tuỳ chọn

    Ward cảnh báo một điều khiến người mới rối: ps có rất nhiều tuỳ chọn, và bạn có thể chỉ định chúng theo ba phong cách khác nhau — Unix, BSD và GNU. Ông chọn BSD vì “nhiều người thấy thoải mái nhất, có lẽ vì gõ ít hơn”.112

    Xem đúng một tiến trình

    Thêm PID vào danh sách đối số. Ward đưa một mẹo gọn: ps u $$ để soi chính tiến trình shell hiện tại, vì $$ là biến shell trả về PID của shell đang chạy.1 Ông cũng hẹn top và lsof tới Chương 8.1

  3. signal · kill

    Tín hiệu — kill không phải “giết”, mà là “gửi một lời nhắn” kill là gửi lời nhắn, không phải đập vỡ Signals — kill doesn'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 pid cho nó chạy tiếp.113

    Lệnh tên là kill như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 kill command. The default is TERM (terminate). You send other signals by adding an option: kill -STOP pid freezes a process rather than terminating it — a stopped process is still in memory, ready to pick up where it left off — and kill -CONT pid continues it.113

    Bạ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ùng kill gử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 using kill to send the INT (interrupt) signal.1

    Vì 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 -9

    Ward 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 -9 chính là kill -KILL. Muốn tra ánh xạ số sang tên, chạy kill -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 fg hoặc bg.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ùng screen cùng tmux.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

  4. 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òn d là 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, w ghi được, x chạ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.1

    Tấ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 — and d is 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: r readable, w writable, x executable (you can run it as a program), and - meaning "nothing" — the permission for that slot has not been granted.1

    Mỗ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ình passwd, vốn cần sửa tệp /etc/passwd.114

    Bạn gặp nó ở đâuWhere you meet it Dùng chmod: 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 file và chmod o+r file, hoặc gộp chmod go+r file; gỡ đi thì dùng go-r.115 Muốn cho người khác xem tệp thì chmod go+r. Use chmod: pick the set of permissions to change, then pick the bit. To add read for group and world: chmod g+r file and chmod o+r file, or in one shot chmod go+r file; to remove, use go-r.115

    Chế độ tuyệt đối bằng số

    chmod 644 file là 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).1

    Sai 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 định

    Lệ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ùng umask 022 nếu muốn mọi người đều thấy được tệp và thư mục bạn tạo, và umask 077 nếu không muốn. Muốn hiệu lực cho các cửa sổ và phiên sau, đặt lệnh umask với chế độ mong muốn vào một trong các tệp khởi động — chủ đề của Chương 13.116

  5. 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ằng ln -s target linkname, trong đó linkname là tên liên kết, target là đường dẫn đích, và cờ -s chỉ định liên kết tượng trưng.117

    Liê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 l in the file-type slot: lrwxrwxrwx 1 ruser users 11 Feb 27 13:52 somedir -> /home/origdir. Create one with ln -s target linkname, where linkname is the link's name, target is the path it points to, and the -s flag specifies a symbolic link.117

    Bạ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.1

    Bốn cách để bị lừa

    Một, đích không cần tồn tại: nếu /home/origdir không có thật, mọi chương trình truy cập somedir sẽ báo lỗi rằng somedir khô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ằng somedir là somedir”; điều này rất khó hiểu vì bạn đang nhìn thấy somedir ngay 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ờ -s

    Cảnh báo nghiêm khắc nhất của mục này: không có -s, ln tạ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, ln sẽ 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

  6. 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: gzip khô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 .gz là một kho GNU Zip. Dùng gunzip file.gz để giải nén và bỏ hậu tố, gzip file để nén lại. Muốn gói thì dùng tar.118

    Có 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. tar lo việc gói. gzip lo 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: gzip does 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 .gz is a GNU Zip archive. Use gunzip file.gz to uncompress and drop the suffix, gzip file to compress again. To archive, use tar.118

    Ba cờ trong tar cvf archive.tar file1 file2 ... mang ba vai trò riêng: c kích hoạt chế độ tạo; v bật đầu ra chẩn đoán chi tiết, khiến tar in tên tệp và thư mục khi gặp — thêm một chữ v nữa thì nó in cả kích thước và quyền; f là tuỳ chọn tệp, và đối số ngay sau f phải là tệp kho mà tar sẽ 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 (-).119

    Bạ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ỏ .gz trước, rồi mới lo .tar — gunzip file.tar.gz rồi tar xvf file.tar. Tạo kho nén thì làm ngược lại: tar trước, gzip sau.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 .gz first, then worry about the .tar — gunzip file.tar.gz then tar xvf file.tar. To create one, do the reverse: tar first, gzip second.1

    Chế độ 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 .tar bằng chế độ mục lục, dùng cờ t thay cho x. 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.1

    Giữ 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 đè umask của bạn và lấy đúng quyền ghi trong kho; p là 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ỏ, tar vẫ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.119

    Lối tắt z và những công cụ khác

    Cá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 đó zcat tương đương gunzip -dc (-d giải nén, -c gửi kết quả ra đầu ra chuẩn).1 Vì lối này quá phổ biến, bản tar đi cùng Linux có lối tắt: cờ z tự gọi gzip — 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: xz và bzip2 (đuôi .xz và .bz2, chậm hơn gzip một chút nhưng thường nén tệp văn bản gọn hơn, giải bằng unxz và bunzip2); zip/unzip tương thích với kho ZIP trên Windows; và đuôi .Z là di vật của chương trình compress — gunzip mở được nhưng gzip không tạo ra.1 Một ghi chú nhỏ: tệp .tgz giống hệt .tar.gz, hậu tố này để vừa với hệ thống tệp FAT.1

  7. 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: /bin chứa chương trình sẵn sàng chạy, gồm hầu hết lệnh Unix cơ bản như ls và cp; /dev chứa tệp thiết bị (Chương 3); /etc là 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; /home giữ thư mục cá nhân của người dùng thường; /lib viết tắt của library, chứa tệp thư viện.1

    Cây thư mục giống một toà nhà có bảng chỉ dẫn: /bin là kho công cụ, /etc là phòng hồ sơ, /home là các căn hộ, /dev là phòng thiết bị, /var là 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: /bin holds ready-to-run programs, including most basic Unix commands such as ls and cp; /dev holds device files (Chapter 3); /etc is the core system configuration directory — Ward even gives the pronunciation, "EHT-see" — containing the user password, boot, device, networking and other setup files; /home holds home directories for regular users; /lib, short for library, holds library files.1

    Bạ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 /usr lặ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ấy bin và lib xuấ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 /usr repeats several directory names found in / — /usr/bin, /usr/lib, /usr/sbin — holding the same kinds of files.1

    Phần còn lại của gốc

    /proc cung 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 /run chứ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/run là một liên kết tượng trưng tới /run.1 /sys tương tự /proc, cung cấp giao diện thiết bị và hệ thống (Chương 3).1 /sbin là 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ó /sbin trong đường dẫn lệnh, và nhiều tiện ích ở đây không chạy nếu không phải root.1 /tmp là 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á /tmp khi máy khởi động.1 /var là 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/tmp mà 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ùng

    Ward 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: /include giữ tệp header cho trình biên dịch C; /local là 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; /man chứa trang hướng dẫn; /share chứ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.1

    Ba thư mục gốc còn lại, và nhân nằm ở đâu

    /boot chứ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). /media là điểm gắn cơ sở cho phương tiện tháo rời như ổ flash. /opt có 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 /vmlinuz hoặ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

  8. sudo · /etc/sudoers

    sudo — vì sao mở một shell root là ý tồi Mượn quyền cao, từng lệnh một sudo — why starting a root shell is a bad idea

    Ward 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 sudo package, which lets administrators run commands as root while logged in as themselves.122

    Bạn gặp nó ở đâuWhere you meet it Khi bạn chạy một lệnh như sudo vipw, sudo ghi lại hành động đó qua dịch vụ syslog dưới nhóm local2. Xem nhật ký trên hầu hết hệ thống bằng journalctl 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 as sudo vipw, sudo logs the action with the syslog service under the local2 facility. Read the logs on most systems with journalctl SYSLOG_IDENTIFIER=sudo; on older systems, look for a logfile in /var/log, such as /var/log/auth.log.1

    Ba 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òng User_Alias ADMINS = user1, user2 định nghĩa một bí danh người dùng gồm hai người; dòng ADMINS ALL = NOPASSWD: ALL cấ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òng root ALL=(ALL) ALL nghĩa là siêu người dùng cũng có thể dùng sudo để 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/sudoers bằng tay

    Ward 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ói sudo có 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/sudoers hơi phức tạp; cần tính năng nâng cao thì xem trang sudoers(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.

  1. Khi bạn gõ echo *, ai là người biến dấu sao thành danh sách tên tệp — shell hay echo?

    Gợi ý sâu hơn: điều gì xảy ra nếu không tệp nào khớp?

  2. Vì sao cd bắ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.

  3. 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 LESS lại là một ví dụ hay?

  4. Sau ls /fffffffff > f, vì sao tệp f rỗng mà màn hình vẫn có chữ?

    Gợi ý sâu hơn: con số trong 2> e và trong 2>&1 nghĩa là gì?

  5. 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?

  6. Vì sao cột TIME trong ps khô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?

  7. kill thậ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?

  8. Đọ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?

  9. tar và gzip là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.gz ra sao?

    Gợi ý sâu hơn: cờ t dùng để làm gì trước khi bạn dùng cờ x?

  10. 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?

  1. Shell là gì? Nó làm gì khi bạn gõ một câu lệnh?

  2. Dấu * nghĩa là gì, và ai là người hiểu nó?

  3. Chữ đi ra màn hình có mấy đường? Kể tên hai đường.

  4. Dấu > và dấu | khác nhau chỗ nào?

  5. Trên tấm biển -rw-r--r--, ai được sửa tệp?

  6. tar làm gì, gzip làm gì?

  7. Thư mục /home chứa gì, còn /etc chứa gì?

  8. Vì sao nên dùng sudo thay vì làm root cả buổi?

  1. When you type echo *, who turns the star into a list of filenames — the shell or echo?

  2. Why must cd be a shell built-in rather than a separate program?

  3. How does a shell variable differ from an environment variable, and which command promotes one to the other?

  4. After ls /fffffffff > f, why is f empty while text still appears on screen?

  5. What are the three components of a Unix error message, and what debugging rule goes with them?

  6. Why isn't the TIME column in ps the time since the process started?

  7. What does kill actually do, and what makes the KILL signal different from all the others?

  8. Read -rw-r--r--: what does the first character say, and to whom do the three groups belong?

  9. tar and gzip do two different jobs — which is which, and in what order do you unpack a .tar.gz?

  10. 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