2013-08-01 35 views
60

Tôi chỉ muốn hiểu dòng mã sau đây trong trình bao. Nó được sử dụng để có được thư mục làm việc hiện tại. Tôi biết rằng $(variable) tên trả về giá trị bên trong tên biến, nhưng $(command) phải trả lại là gì? Liệu nó trả về giá trị sau khi thực hiện lệnh? Trong trường hợp đó, chúng ta có thể sử dụng ` để thực hiện lệnh.

CWD="$(cd "$(dirname $0)"; pwd)" 

Cùng đầu ra có thể được lấy từ các dòng mã sau đây cũng trong phiên bản khác nhau của vỏ

DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 

Tôi không thể hiểu được ý nghĩa của $(cd..$(dirname.

Ai đó có thể giúp tôi tìm ra cách lệnh này được thực thi không?

+1

Và đây là câu hỏi về các ưu điểm/nhược điểm của '$()' so với '\' \ '': http://stackoverflow.com/questions/9449778/what-is-the-benefit-of- sử dụng-thay-of-backticks-in-shell-script –

Trả lời

65

Cách sử dụng $ như ${HOME} cho giá trị HOME. Việc sử dụng số $ như $(echo foo) có nghĩa là chạy bất kỳ thứ gì nằm trong dấu ngoặc đơn trong một vỏ con và trả về giá trị đó. Trong ví dụ của tôi, bạn sẽ nhận được foo từ echo sẽ viết foo tiêu chuẩn ra

+6

điều tương tự được thực hiện bởi \ 'echo foo \ ', tôi có đúng không? – KItis

+25

Có; '$ (...)' là cách viết tốt hơn lệnh cố gắng sử dụng dấu ngoặc kép. Xem xét việc viết: 'gcclib = $ (dirname $ (dirname $ (gcc)))/lib' bằng cách sử dụng dấu ngoặc kép. Ngay cả trước khi bạn gặp khó khăn khi thực hiện nó trong Markdown, nó khó hơn vì bạn phải thoát khỏi các backquotes của các lệnh lồng nhau, trong khi bạn không có ký hiệu '$ (...)'. –

+6

Về mặt kỹ thuật, '$ (echo foo)' tạo ra một lệnh thay thế, không phải là một subshell. Câu trả lời hiện tại khác được quyền này. Tôi nghĩ rằng thay thế lệnh được chạy trong một subshell, loại, nhưng họ vẫn còn những khái niệm khác nhau. – trysis

15
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 

Could anybody help me to figure out how this command get executed?

Cho phép xem xét các phần khác nhau của lệnh. BASH_SOURCE là biến mảng bash chứa tên tệp nguồn. Vì vậy, "${BASH_SOURCE[0]}" sẽ trả lại cho bạn tên của tệp tập lệnh.

dirname là một tiện ích được cung cấp bởi lõi hạt nhân GNU xóa thành phần cuối từ tên tệp. Do đó, nếu bạn thực thi tập lệnh của mình bằng cách nói bash foo, "$(dirname "${BASH_SOURCE[0]}")" sẽ trả lại .. Nếu bạn nói bash ../foo, nó sẽ trả lại ..; cho bash /some/path/foo nó sẽ trả về /some/path.

Cuối cùng, toàn bộ lệnh "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" nhận thư mục tuyệt đối chứa tập lệnh được gọi.

$(...) cho phép thay thế lệnh, nghĩa là cho phép đầu ra của lệnh thay thế chính lệnh đó và có thể lồng nhau.

+0

Xin lỗi vì đã trễ 3 năm cho bữa tiệc, nhưng bạn có thể vui lòng giải thích * tại sao * câu lệnh hoạt động không? Bạn nói 'dirname' trả về đường dẫn của tệp được thực hiện (tương đối hoặc tuyệt đối với thư mục làm việc hiện tại),' cd' thay đổi pwd thành thư mục đó và 'pwd' in ra đường dẫn tuyệt đối của thư mục làm việc hiện tại. Nhưng tại sao họ lại tham gia bởi '&& '? Và những gì sẽ 'DIR' giữ nếu' cd' thất bại? – Christian

Các vấn đề liên quan