banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix Vài thắc mắc về bài viết "Đối thoại với Rookie phần 3"  XML
  [Question]   Vài thắc mắc về bài viết "Đối thoại với Rookie phần 3" 07/11/2007 05:36:48 (+0700) | #1 | 95793
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]

conmale wrote:
6. "Vật vã":
...
Đây, để thỏa mãn nỗi bức xúc của em, xem thử một lệnh:[/i]
Code:
find / -depth -type f -perm -0202 | xargs file | cut -f1 -d: | while read file; do printf "cuti is insane\n" >> $file; done


Em thử xem nó có nghĩa là gì? Tác dụng của nó làm gì?"
...
Nhớ đừng chạy cái lệnh trên và nhất là không được chạy nó bằng root không thì em phải cài lại con Linux của em đó
...
<còn tiếp> 

Đêm qua em ngồi đọc lại phần 3 này của anh. Em muốn thảo luận thêm một chút về cái lệnh này

+ Tuỳ chọn -depth: Trong man của lệnh find có nói là "Process each directory’s contents before the directory itself". Thấy hơi "mông lung" em "google" tiếp thì kiếm được đoạn này:
-depth starts at lowest level in directory tree rather than root of given directory 

Như vậy có thể hiểu, tùy chọn -depth sẽ bắt đầu từ cấp thấp nhất trong cây thư mục sau đó mới tìm gốc của cây thư mục đó

+ -type f: tìm tất cả các regular file

+ -perm -0202: tìm tất cả các file mà owner và other users có quyền write

+ xargs file: Nôm na thì xargs chấp nhận danh sách "các thứ" kiếm được trước đó, như một standard input, sau đó cung cấp "các thứ" này như một tham số cho lệnh được gửi sau đó (ở đây là lệnh file). Lệnh file sẽ xác định loại file của "các thứ tìm được". Theo em hiểu, lệnh xargs gần tương tự như lệnh exec.

+ cut -f1 -d: Nôm na thì em hiểu cut như một lệnh "cắt dọc". Đoạn lệnh này sẽ lấy cột đầu tiên, và được ngăn cách (delimited) bởi dấu hai chấm ":"

Như vậy từ đầu đến giờ, đoạn lệnh này:
Code:
find / -depth -type f -perm -0202 | xargs file | cut -f1 -d:

sẽ tìm trong thư mục root (/) tất cả những regular file mà owner và other users có quyền write. Sau đó xác định loại file của tất cả các file tìm được. Sau đó cut lấy cột đầu tiên

Em sẽ lấy ví dụ dần dần, giả sử em thực hiện một lệnh tương tự:
Code:
find $(pwd) -type f -perm -0744 | grep Lesson | xargs file

Kết quả trả về sẽ là:
/home/quanta/Lesson.odt: OpenDocument Text 

tiếp theo:
Code:
find $(pwd) -type f -perm -0744 | grep Lesson | xargs file | cut -f1 -d:

Lệnh này sẽ trả về:
/home/quanta/Lesson.odt 

Đây chính là đường dẫn đầy đủ của các file được tìm thấy.

+ while read file; do printf "cuti is insane\n" >> file; done: Tất cả các thứ tìm được sẽ được đọc vào biến "file" trong vòng lặp while do. Với mỗi lần lặp sẽ "nhét thêm" dòng chữ "cuti is insane" vào cuối của biến $file.
Em thử thực hiện một lệnh tương tự:
Code:
find $(pwd) -type f -perm -0744 | grep Lesson | xargs file | cut -f1 -d: | while read file; do printf "quanta day" >> $file | echo $file; done

Sau khi thi hành lệnh này, biến $file sẽ có giá trị: /home/quanta/Lesson.odt

Quay về với lệnh của anh, em thử:
Code:
sudo find / -depth -type f -perm -0202 -print

thì thu được phần lớn các file nằm trong attr hoặc task của /proc
Phần lớn các file này đều thuộc tập hợp: current, exec, fscreate, keycreate, prev, sockcreate. Có lẽ em cần tìm hiểu thêm về "bọn" này.

Đến đây em thấy "bế tắc"

Không hiểu ở đây, anh muốn lấy đường dẫn đầy đủ của các file nằm trong /proc (như: /proc/10690/task/10690/attr/exec, /proc/9057/attr/sockcreate, ...) cho vào vòng lặp while ... do, đọc vào biến file, in thêm dòng text kia vào cuối $file... để làm gì? Em phỏng đoán là: vòng lặp này sẽ vô hạn, do đó làm "die" linux chăng?

Anh giải thích giúp em?
Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Re: Vài thắc mắc về bài viết "Đối thoại với Rookie phần 3" 07/11/2007 11:52:13 (+0700) | #2 | 95873
Mr.Khoai
Moderator

Joined: 27/06/2006 01:55:07
Messages: 954
Offline
[Profile] [PM]
Chào quanta,

Phần 'while read file' không phải là infinite loop. Anh chú ý đây là read file, không phải read $file nên từ file là cố định và không hề bị ảnh hưởng gì bởi output của các lệnh trước đó.

read sẽ đọc một dòng từ stdin. Đám lệnh từ đầu đến sau cái cut sẽ cho ra một loạt các filename, mỗi file nằm tại một dòng. Vòng lặp while này chỉ để step qua từng file trong các files tìm được.

Cho mỗi file tìm được, cái script trên sẽ echo gì đó vào cuối file. Nếu muốn "phá" ngon hơn có lẽ mình nên sử dụng echo "test" > $file thay vì sử dụng >>. Lúc đó toàn bộ nội dung file sẽ...biến mất. Hậu quả của việc append vào cuối chỉ có thể làm format của file bị thay đổi, hoặc nếu effective uid có quyền thì có thể break một số kernel parameters.

Cái này hỏi anh conmale: Em không hiểu vì sao lại phải while read file; do, em nghĩ while read; do là đựoc rồi chứ anh?

khoai
[Up] [Print Copy]
  [Question]   Re: Vài thắc mắc về bài viết "Đối thoại với Rookie phần 3" 07/11/2007 12:31:37 (+0700) | #3 | 95886
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]

Mr.Khoai wrote:
Chào quanta,

Phần 'while read file' không phải là infinite loop. Anh chú ý đây là read file, không phải read $file nên từ file là cố định và không hề bị ảnh hưởng gì bởi output của các lệnh trước đó.
 

--> hì, cái này tớ gõ nhầm
--> Mình không nghĩ thế. Mình nghĩ là: sau khi lấy được tất cả các filename, mỗi file trên một dòng. Vòng lặp while ... do sẽ đọc lần lượt từng dòng, cho vào biến file, sau đó echo vào cuối mỗi file tìm được đoạn text trên.

Mr.Khoai wrote:

...
Cái này hỏi anh conmale: Em không hiểu vì sao lại phải while read file; do, em nghĩ while read; do là đựoc rồi chứ anh?

khoai 

Nếu khoai dùng while read; do thì cái echo "quanta" >> $file; done làm sao nó hiểu được, lỗi ngay:
bash: $file: ambiguous wwwect 


ps: Mấu chốt của vấn đề ở đây có lẽ là đoạn này:
Code:
while read file; do printf "cuti is insane\n" >> $file; done

Đọc từng dòng một vào biến file, lúc này biến file có giá trị là đường dẫn đầy đủ của các file được tìm thấy. Nhưng sau đó việc dùng printf "cuti is insane\n" >> $file phải hiểu là "mở" những file được tìm thấy ra, append vào đoạn text trên

Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Re: Vài thắc mắc về bài viết "Đối thoại với Rookie phần 3" 07/11/2007 17:50:34 (+0700) | #4 | 95939
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

Mr.Khoai wrote:

Cái này hỏi anh conmale: Em không hiểu vì sao lại phải while read file; do, em nghĩ while read; do là đựoc rồi chứ anh?

khoai 


Vì.. nó safe đó em smilie.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Re: Vài thắc mắc về bài viết "Đối thoại với Rookie phần 3" 08/11/2007 01:05:48 (+0700) | #5 | 95990
Mr.Khoai
Moderator

Joined: 27/06/2006 01:55:07
Messages: 954
Offline
[Profile] [PM]
Àh, dạ đúng là read có thể bỏ stdin vào một biến tạm, ở đây là file. Do đó khi wwwect ra $file thì mỗi lần đi qua vòng lặp sẽ wwwect ra một file khác. Lần trước em test với....1 file nên làm thế nào cũng đúng :p

khoai
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|