Xuất PATH = gì đó: $ PATH có nghĩa là gì?


27

Tôi rất mới với Linux và tôi đặt lệnh sau ở cuối tệp .profiletrong thư mục nhà của mình:

export PATH="~/.composer/vendor/bin:$PATH"

Tôi biết các vấn đề về biến môi trường và giá trị của chúng một chút từ Windows, nhưng trong trường hợp này tôi muốn hiểu lệnh này làm gì và các phần mà nó bao gồm:

  1. Cụm từ "xuất khẩu" này khi bắt đầu là gì? Có phải nó đang xuất dữ liệu để có sẵn cho Bash?

  2. Cái thứ nhất PATHvà cái thứ hai là gì $PATHvà tại sao chúng ta cần hai cái?


Một số khác biệt về kỹ thuật giữa các hệ điều hành sang một bên, nó tương đương với quy trình này trên Windows: windowsitpro.com/systems-man quản lý / từ
Nhà giả kim hai bit

1
"xuất khẩu" làm cho sự thay đổi hiển thị đối với các chương trình mới được khởi chạy bởi bash.
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersen: không, điều đó xảy ra cho dù bạn có sử dụng exportlệnh hay không , bởi vì PATHbiến đã được đánh dấu là đã xuất. (Hãy thử cả hai cách nếu bạn không tin tôi!)
David

Câu trả lời:


39

Cụm từ "xuất khẩu" này khi bắt đầu là gì?

exportlà một lệnh (chính xác hơn đó là lệnh dựng sẵn của Bash , tức là nó không phải là một phần tử thực thi trong PATHđó, đó là một lệnh mà Bash đã tích hợp sẵn trong chính nó).

Có phải nó đang xuất dữ liệu để có sẵn cho Bash?

exportđặt biến môi trường ở bên trái của phép gán thành giá trị ở phía bên phải của phép gán; biến môi trường như vậy được hiển thị cho quá trình thiết lập nó và cho tất cả các quy trình con được sinh ra trong cùng một môi trường, tức là trong trường hợp này với trường hợp Bash, nguồn ~/.profilevà cho tất cả các quy trình con được sinh ra trong cùng một môi trường (có thể bao gồm cả các shell khác , sẽ lần lượt có thể truy cập nó).

Cái thứ nhất PATHvà cái thứ hai là gì $PATHvà tại sao chúng ta cần hai cái?

Đầu tiên PATHnhư được giải thích ở trên là biến môi trường được thiết lập bằng cách sử dụng export.

PATHthông thường chứa một cái gì đó khi ~/.profilecó nguồn gốc (theo mặc định nó chứa /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games), chỉ cần đặt PATHthành ~/.composer/vendor/binsẽ PATHchỉ chứa ~/.composer/vendor/bin.

Vì vậy, kể từ khi tham chiếu đến một biến trong một lệnh được thay thế bằng (hoặc "mở rộng" để) giá trị của biến bởi Bash tại thời điểm đánh giá của lệnh , :$PATHđược đặt ở phần cuối của giá trị được gán cho PATHđể PATHđầu lên có chứa ~/.composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games( tức là những gì PATHđã chứa cộng ~/.composer/vendor/bin:lúc bắt đầu).


Giải thích tuyệt vời.
Choylton B. Higginbottom

16

https://help.ubfox.com/community/En MôiVariables có thể sẽ giúp bạn. Cũng man bashcó thể rất hữu ích với việc hiểu cách thức hoạt động (ít nhất là trong Bash)

Dù sao - PATH=về cơ bản, bạn đang thiết lập PATHbiến, thêm một số đường dẫn mới để tìm kiếm, thêm vào cuối đường dẫn đã được đặt / trước đó, với $PATH(về cơ bản là tham chiếu đến PATHbiến).

Vì vậy, giả sử của bạn PATHđã được đặt thành một cái gì đó như:

PATH="x:y:z"

và sau đó bạn đặt

PATH="a:b:c:$PATH"

PATHsau đó của bạn sẽ như thế nào:

a:b:c:x:y:z

Tôi hy vọng điều đó đúng.

Và trên hết, bạn xuất biến mới để nó được biết đến trong môi trường của bạn, bao gồm cả các tiến trình / lớp con.

Chỉ cần lưu ý rằng thứ tự của các thư mục như được thiết lập PATHcó thể quan trọng. Và một cái gì đó như PATH="$PATH:a:b:c"sẽ cho bạn kết quả:

x:y:z:a:b:c

sẽ ảnh hưởng đến thứ tự của các thư mục / đường dẫn trong khi tìm kiếm lệnh (nếu bạn có lệnh của bạn trong nhiều hơn một thư mục, tìm thấy đầu tiên sẽ được sử dụng - đôi khi có thể cho bạn một số kết quả không mong muốn).


2

Đây là lệnh để mọi người có thể làm theo khi họ đi qua các điểm đạn. export PATH="~/.composer/vendor/bin:$PATH"

  • exportShell được tích hợp sẵn (nghĩa là không có /bin/export, đó là lệnh shell) về cơ bản làm cho các biến môi trường có sẵn cho các chương trình khác được gọi từ bash(xem câu hỏi được liên kết trong Đọc thêm) và các lớp con.
  • Chuyển nhượng trong shell sẽ mở rộng trước, sau đó chuyển nhượng sẽ diễn ra thứ hai. Vì vậy, những gì bên trong dấu ngoặc kép được mở rộng trước, được lưu vào PATHbiến sau.
  • $PATHPATHphép gán mặc định (hoặc ít nhất là biến trông như thế nào cho đến khi lệnh này xuất hiện trong .bashrchoặc .profile) của bạn và mở rộng nó.
  • ~/.composer/vendor/binsẽ mở rộng đến /home/username/.composer/vendor/bin, nơi .composerthư mục bị ẩn do dấu chấm hàng đầu.
  • Cái ngắn đó ~/.composer/vendor/bin:$PATHgiờ đã chuyển thành danh sách dài các thư mục, cách nhau bởi :. Tất cả mọi thứ được đính kèm trong dấu ngoặc kép để chúng tôi bao gồm các thư mục có khoảng trắng trong đường dẫn của chúng.
  • Cuối cùng, mọi thứ được lưu trữ vào PATHcác lệnh biến và bên ngoài được phép sử dụng nó

Ví dụ đơn giản

Vỏ tương tác của tôi thực sự mksh, điều này cũng xảy ra export. Bằng cách sử dụng exportđể đặt VAR, biến của tôi có thể được chuyển đến và được sử dụng bởi chuỗi lệnh / quy trình con tiếp theo, nơi tôi đã xuất cùng biến đó

$ echo $SHELL            
/bin/mksh
$ VAR="HelloAskUbuntu"
$ bash -c 'echo $VAR' 
$ export VAR="HelloAskUbuntu"                                                  
$ bash -c 'echo $VAR'                                                          
HelloAskUbuntu
$ 

Đọc thêm


3
Không, phần ~trong ~/.composer/vendor/binsẽ không được mở rộng! Dấu ngã chỉ được mở rộng ở một vài nơi đặc biệt, như trực tiếp sau =dấu hiệu. PATH="~/.foo:$PATH"kết quả trong ~/.foo:/other/path/dirs.... Nhưng ~sẽ được mở rộng PATH=~"/.foo:$PATH", kết quả là /home/user/.foo:/other/path/dirs....
Volker Siegel

2

Tôi đã đọc ở đây và ở những nơi khác trên web, đã nói chuyện với một người bạn về điều này và quyết định rằng khi là sinh viên năm nhất (có thể là sinh viên năm nhất của Ubuntu thì một số người ở đây có thể nghĩ), tôi nên lập bản đồ lệnh này - Tôi nên tạo một bản đồ và do đó, tìm hiểu về những gì và nơi ở:

Dữ liệu sơ bộ

Nếu bây giờ bạn không hiểu điều gì trong chương này - đừng lo lắng, mọi chuyện sẽ rõ ràng hơn khi bạn tiếp tục đọc, nhưng để hiểu vấn đề này, bạn cần phải đọc các biến Môi trường (EV), giá trị và mục đích của chúng . Bây giờ tôi sẽ cố gắng giải thích lệnh bằng những từ đơn giản và theo phương pháp ánh xạ, cho những người mới như tôi và chỉ cho những người mới. Đã cố gắng làm hết sức mình ở đây ...

Lập bản đồ

export PATH="~/.composer/vendor/bin:$PATH"

Giá trị ban đầu của EV "PATH" như đi kèm với Ubuntu 15.10, là:

/usr/bin:/usr/sbin

Trong chính lệnh lưu ý chúng ta có hai cụm từ PATH. Cái cuối cùng là $ PATH - $ nói "in giá trị gốc hoặc giá trị của EV bên cạnh bạn"; EV bên cạnh nó là EV EV.

Chúng tôi đã tự xuất biến biến đường dẫn (cũng có sẵn cho các quy trình phụ, các quy trình IE chạy trong CLI không thực sự là vỏ Bash, nhưng chạy bên trong nó (như Drush , là Drupal CLI).

Bên cạnh việc xuất, chúng tôi cũng mở rộng nó: Cụm từ PATH đầu tiên (PATH =) đã sử dụng chúng tôi để thêm một giá trị bổ sung (~ / .composer / nhà cung cấp / bin :) vào giá trị ban đầu (được biểu thị bằng $ PATH).

  • Dấu hai chấm (:) ở cuối giá trị mới tôi đã đề cập trong đoạn trên, sử dụng để phân biệt giá trị mới với giá trị ban đầu.

  • "" Là khu vực chứa giá trị / s.

  • ~ Là thư mục nhà.


Tôi hy vọng rằng sau khi ánh xạ này tôi đã làm, lệnh sẽ rõ ràng hơn đối với sinh viên năm nhất như tôi.


1

Các exportlệnh làm biến sẵn trong subshells. Đó là, nếu không có nó, biến PATHsẽ không thể nhìn thấy trong các lớp con.

PATH được đề cập hai lần:

  • Khi biến, giá trị được gán cho, bên trái của =dấu hiệu.
  • Như tên biến được thay thế bởi giá trị của nó của =dấu hiệu. Điều này làm cho giá trị cũ là một phần của giá trị mới.

1
"Đó là, nếu không có nó, biến PATHsẽ không thể nhìn thấy trong các lớp con." Điều này là không chính xác; PATHlà một biến môi trường (không hoàn toàn giống với biến shell ) nên nó được tự động xuất ra và exportlệnh không cần thiết.
David

Họ vỏ Bourne không thực sự phân biệt giữa các biến vỏ và biến môi trường. ( sc.tamu.edu/help/general/unix/vars.html ) Trên hệ thống của tôi (Arch Linux), bash thậm chí không biết setenvlệnh.
rexkogitans

1
Vẫn còn một sự khác biệt giữa các biến môi trường mà kernel biết và các biến shell là nội bộ của bash. Vì PATHcó nguồn gốc từ môi trường, nó được tự động xuất ra, do đó bạn không cần phải chạy exportđể thay đổi được truyền đến các tiến trình con (trái với những gì trang bạn liên kết nói).
David

Các biến môi trường không phải là một thuộc tính của kernel, mà là của quá trình. Vì quá trình chúng ta đang nói ở đây là sh, bash (Ubuntu có sử dụng zsh không?), Tôi nghĩ rằng chúng ta có thể để chúng bằng với các biến shell. Nhưng, tất nhiên, các biến shell không được truyền cho bất kỳ chương trình ngẫu nhiên nào như các biến môi trường.
rexkogitans

Tôi nghĩ rằng chúng ta đang sa lầy vào ngữ nghĩa vào thời điểm này. Tất cả những gì tôi đã cố gắng nói là trong bash, PATH=fooexport PATH=foocó hành vi giống hệt nhau.
David

0
export PATH="~/.composer/vendor/bin:$PATH"
  1. the exportlà một lệnh buildin của bash, có nghĩa là các biến xuất là biến envorrow. (bạn có thể gõ help exportđể nghiêng nhiều hơn

    (các charactor theo lệnh là tham số, được chia theo khoảng trắng, vì vậy trong trường hợp này, chỉ có một tham số)

  2. những PATHlà tên biến, thông thường, xác định trước varibale bởi bash, có tên trong hoa.

  3. các =nghĩa giá trị assign để biến này.

  4. tất cả các chuỗi là giá trị của varibale

  5. những $PATHlà một loại funciton của bash, tên variable expantion, bash sẽ thay thế giá trị của tồn tại PATHtrong chuỗi tham số, TRƯỚC gửi chuỗi exportlệnh

  6. các :trong một char spcial trong biến PATH và understooded bởi tất cả các ứng dụng mà muốn sử dụng biến này. nó có nghĩa là ngăn cách. vì vậy họ sẽ có rất nhiều thư mục trong biến PATH.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.