Các đường dẫn - lệnh của tôi ở đâu?
Một số lệnh bash được dựng sẵn, trong khi các lệnh khác ở bên ngoài. Bây giờ chúng ta hãy xem các lệnh bên ngoài và cách để chạy chúng và cách làm thế nào để biết một lệnh là lệnh bên trong.
Shell tìm thấy lệnh ở đâu?
Các lệnh bên ngoài chỉ là các tập tin trong hệ thống tập tin của bạn. Việc quản lý tập tin cơ bản sẽ được trình bày trong bài viết khác của loạt bài này. Trên các hệ thống Linux và UNIX, tất cả các tập tin được truy cập như một phần của một cây lớn duy nhất có gốc ở /. Trong ví dụ của chúng ta, cho đến nay, thư mục hiện tại của chúng ta là thư mục nhà của người dùng.
Những người dùng không là root thường có một thư mục nhà ở trong thư mục /home, ví dụ như là /home/ian, trong trường hợp của tôi. Thư mục nhà của root luôn là /root. Nếu bạn gõ một tên lệnh, thì bash sẽ tìm lệnh này trên đường dẫn của bạn, đó là một danh sách các thư mục được phân tách bằng dấu hai chấm trong biến môi trường PATH.
Nếu bạn muốn biết lệnh nào sẽ được thực hiện khi bạn gõ một chuỗi ký tự cụ thể, hãy sử dụng lệnh which hay type. Liệt kê 17 cho thấy đường dẫn mặc định của tôi cùng với các vị trí của một số lệnh.
Liệt kê 17. Tìm các vị trí lệnh
[ian@echidna ~]$ echo $PATH /usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/bin:/usr/b in:/home/ian/bin [ian@echidna ~]$ which bash env zip xclock echo set ls alias ls='ls --color=auto' /bin/ls /bin/bash /bin/env /usr/bin/zip /usr/bin/xclock /bin/echo /usr/bin/which: no set in (/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache :/usr/local/bin:/bin:/usr/bin:/home/ian/bin) [ian@echidna ~]$ type bash env zip xclock echo set ls bash is hashed (/bin/bash) env is hashed (/bin/env) zip is /usr/bin/zip xclock is /usr/bin/xclock echo is a shell builtin set is a shell builtin ls is aliased to `ls --color=auto' |
Lưu ý rằng các thư mục trong đường dẫn chủ yếu là kết thúc ở /bin. Đây là một quy ước chung, nhưng không phải là một yêu cầu bắt buộc, như bạn có thể thấy từ /usr/lib/ccache. Lệnh which đã thông báo rằng lệnh ls là một alias (bí danh) và không thể tìm thấy lệnh set.
Trong trường hợp này, chúng ta diễn giải điều đó có nghĩa là lệnh không tồn tại hay đó là một lệnh dựng sẵn. Lệnh type thông báo rằng lệnh ls là một alias, nhưng nó nhận biết lệnh set như là một lệnh shell đã dựng sẵn. Nó cũng thông báo rằng có một lệnh echo dựng sẵn cũng như có một lệnh trong /bin mà which đã tìm thấy. Các lệnh cũng tạo ra kết quả đầu ra theo các thứ tự khác nhau.
Chúng ta thấy rằng lệnh ls được sử dụng để liệt kê các nội dung thư mục, là một alias. Các bí danh là một cách tiện dụng để cấu hình một số lệnh để sử dụng các tập hợp mặc định khác nhau hoặc để cung cấp một tên thay thế cho một lệnh.
Trong ví dụ của chúng ta, tùy chọn --color=tty làm cho các liệt kê thư mục sẽ phân biệt kiểu tập tin hoặc thư mục bằng màu sắc khác nhau. Hãy thử chạy dircolors --print-database để xem các mã màu sắc được kiểm soát như thế nào và loại màu nào được dùng cho loại tập tin nào.
Mỗi một trong số các lệnh này có các tùy chọn bổ sung. Tùy thuộc vào nhu cầu của bạn, bạn có thể sử dụng lệnh này hay lệnh kia. Tôi có xu hướng sử dụng lệnh which khi tôi khá chắc chắn là sẽ tìm thấy một tập tin thi hành được và tôi chỉ cần đặc tả đường dẫn đầy đủ của nó. Tôi thấy rằng lệnh type cho tôi biết thêm nhiều thông tin chính xác hơn, mà đôi khi tôi cần trong một kịch bản lệnh shell.
Chạy các lệnh khác
Chúng ta đã thấy trong Liệt kê 17 rằng các tập tin có thể thi hành được có một đường dẫn đầy đủ bắt đầu bằng /, tức là thư mục gốc. Ví dụ, chương trình xclock thực sự là /usr/bin/xclock, một tập tin nằm trong thư mục /usr/bin. Trên các hệ thống cũ hơn, thay vào đó, bạn có thể tìm thấy tập tin này trong thư mục /usr/X11R6/bin.
Nếu một lệnh không có trong đặc tả PATH (đường dẫn) của bạn, bạn vẫn có thể chạy nó bằng cách chỉ rõ đường dẫn cùng với tên lệnh. Bạn có thể sử dụng hai loại đường dẫn:
- Các đường dẫn tuyệt đối (absolute) là những đường dẫn bắt đầu bằng /, như là những đường dẫn chúng ta đã thấy trong Liệt kê 17 (/bin/bash, /bin/env, v.v).
- Các đường dẫn tương đối (relative) so với vị trí thư mục làm việc hiện tại của bạn, như lệnh pwd báo lại. Những lệnh này không bắt đầu bằng /, mà chứa ít nhất một /.
Bạn có thể sử dụng các đường dẫn tuyệt đối bất kể thư mục làm việc hiện tại của bạn ở đâu, nhưng nhiều khả năng bạn sẽ có thể sử dụng các đường dẫn tương đối chỉ khi một lệnh nằm ở rất gần với thư mục hiện tại của bạn. Giả sử bạn đang phát triển một phiên bản mới của chương trình "Hello World!" kinh điển trong một thư mục con của thư mục nhà của bạn tên là mytestbin.
Bạn có thể sử dụng đường dẫn tương đối để chạy lệnh của bạn dưới dạng mytestbin/hello. Có hai tên đặc biệt bạn có thể sử dụng trong một đường dẫn; một dấu chấm duy nhất (.) dùng để chỉ thư mục hiện tại và một cặp dấu chấm (..) để chỉ thư mục cha mẹ của thư mục hiện hành. Vì thư mục nhà của bạn thường không có trên PATH của bạn (và nói chung không nên có), bạn sẽ cần phải cung cấp tường minh một đường dẫn cho bất kỳ tập tin thi hành được nào mà bạn muốn chạy từ thư mục nhà của bạn.
Ví dụ, nếu bạn đã có một bản sao của chương trình hello của bạn trong thư mục nhà của bạn, bạn có thể chạy nó bằng lệnh ./hello. Bạn có thể sử dụng cả dấu . và dấu .. như một phần của một đường dẫn tuyệt đối, mặc dù một dấu chấm . đơn không có ích lợi gì trong trường hợp này. Bạn cũng có thể sử dụng một dấu ngã (~) có nghĩa là thư mục nhà của bạn và ~username có nghĩa là thư mục nhà của người dùng có tên username. Một số ví dụ được hiển thị trong Liệt kê 18.
Liệt kê 18. Các đường dẫn tuyệt đối và tương đối
[ian@echidna ~]$ /bin/echo Use echo command rather than builtin Use echo command rather than builtin [ian@echidna ~]$ /usr/../bin/echo Include parent dir in path Include parent dir in path [ian@echidna ~]$ /bin/././echo Add a couple of useless path components Add a couple of useless path components [ian@echidna ~]$ pwd # See where we are /home/ian [ian@echidna ~]$ ../../bin/echo Use a relative path to echo Use a relative path to echo [ian@echidna ~]$ myprogs/hello # Use a relative path with no dots -bash: myprogs/hello: No such file or directory [ian@echidna ~]$ mytestbin/hello # Use a relative path with no dots Hello world! [ian@echidna ~]$ ./hello Hello world! [ian@echidna ~]$ ~/mytestbin/hello # run hello using ~ Hello world! [ian@echidna ~]$ ../hello # Try running hello from parent -bash: ../hello: No such file or directory |
Thay đổi thư mục làm việc của bạn
Cũng giống như bạn có thể thi hành các chương trình từ các thư mục khác nhau trong hệ thống, bạn có thể thay đổi thư mục làm việc hiện tại của bạn bằng cách sử dụng lệnh cd. Đối số của cd phải là đường dẫn tuyệt đối hay tương đối tới một thư mục.
Cũng giống như với các lệnh, bạn có thể sử dụng dấu ., dấu .., dấu ~, và ~username trong đường dẫn. Nếu bạn sử dụng cd mà không có tham số nào, đó sẽ là chuyển tới thư mục nhà của bạn. Một gạch nối duy nhất (-) là tham số dùng để chuyển đến thư mục làm việc trước đó.
Thư mục nhà của bạn được lưu trữ trong biến môi trường HOME và thư mục trước đó được lưu trữ trong biến OLDPWD, do đó một mình cd tương đương với cd $HOME và cd - tương đương với cd $OLDPWD. Thông thường chúng ta nói thay đổi thư mục thay cho toàn văn thay đổi thư mục làm việc hiện tại.
Cũng giống như đối với các lệnh, cũng có một biến môi trường, CDPATH, chứa một tập hợp các thư mục được phân tách bằng dấu hai chấm cần được tìm kiếm (ngoài thư mục làm việc hiện tại) khi phân giải các đường dẫn tương đối. Nếu việc phân giải đã sử dụng một đường dẫn từ CDPATH, thì cd sẽ in đường dẫn đầy đủ của thư mục kết quả làm đầu ra.
Thông thường, nếu chuyển đổi thư mục thành công, không dẫn đến kết quả đầu ra nào khác hơn là một dấu nhắc mới, có thể đổi khác. Một số ví dụ được hiển thị trong Liệt kê 19.
Liệt kê 19. Thay đổi các thư mục
[ian@echidna ~]$ cd /;pwd / [ian@echidna /]$ cd /usr/local;pwd /usr/local [ian@echidna local]$ cd ;pwd /home/ian [ian@echidna ~]$ cd -;pwd /usr/local /usr/local [ian@echidna local]$ cd ~ian/..;pwd /home [ian@echidna home]$ cd ~;pwd /home/ian [ian@echidna ~]$ export CDPATH=~ [ian@echidna ~]$ cd /;pwd / [ian@echidna /]$ cd mytestbin /home/ian/mytestbin |






