Sử dụng xuất trong .bashrc


45

Tôi đã nhận thấy .bashrcrằng một số dòng có exporttrước mặt họ, chẳng hạn như

export HISTTIMEFORMAT="%b-%d  %H:%M  "
...
export MYSQL_HISTFILE="/root/.mysql_history"

trong khi những người khác thì không, chẳng hạn như

HISTSIZE=100000

Tôi tự hỏi nếu, đầu tiên, điều này là chính xác, và thứ hai quy tắc là gì để sử dụng exporttrong .bashrc.

Câu trả lời:


53

Bạn chỉ cần exportcác biến nên được "nhìn thấy" bởi các chương trình khác mà bạn khởi chạy trong shell, trong khi các biến chỉ được sử dụng bên trong shell thì không cần phải chỉnh sửa export.

Đây là những gì trang người đàn ông nói:

The  supplied  names are marked for automatic export to the environ‐
ment of subsequently executed commands.  If the -f option is  given,
the  names  refer to functions.  If no names are given, or if the -p
option is supplied, a list of all names that are  exported  in  this
shell  is  printed.   The -n option causes the export property to be
removed from each name.  If a variable name is  followed  by  =word,
the  value  of  the variable is set to word.  export returns an exit
status of 0 unless an invalid option  is  encountered,  one  of  the
names  is  not a valid shell variable name, or -f is supplied with a
name that is not a function.

Điều này có thể được chứng minh bằng những điều sau đây:

$ MYVAR="value"
$ echo ${MYVAR}
value
$ echo 'echo ${MYVAR}' > echo.sh
$ chmod +x echo.sh
$ ./echo.sh

$ export MYVAR="value-exported"
$ ./echo.sh
value-exported

Giải trình:

  • Lần đầu tiên tôi đặt ${MYVAR}là biến Shell với MYVAR="value". Sử dụng echoI có thể lặp lại giá trị của nó vì echo là một phần của shell.
  • Sau đó tôi tạo ra echo.sh. Đó là một kịch bản nhỏ về cơ bản là giống nhau, nó chỉ lặp lại ${MYVAR}, nhưng sự khác biệt là nó sẽ chạy trong một quy trình khác vì đó là một kịch bản riêng biệt.
  • Khi gọi echo.shnó không có kết quả gì, vì quy trình mới không kế thừa${MYVAR}
  • Sau đó, tôi xuất ${MYVAR}vào môi trường của mình với exporttừ khóa
  • Khi tôi chạy lại như cũ echo.sh, nó lặp lại nội dung ${MYVAR}vì nó lấy nó từ môi trường

Để trả lời câu hỏi của bạn:

Nó phụ thuộc vào nơi một biến sẽ được sử dụng, cho dù bạn có phải xuất nó hay không.


17

Sử dụng exportcho các biến môi trường . Biến môi trường là một tính năng hệ điều hành. Các biến môi trường được kế thừa bởi các tiến trình con: nếu bạn đặt chúng trong một trình bao, chúng có sẵn trong tất cả các chương trình được bắt đầu bởi trình bao này. Các biến được sử dụng bởi nhiều ứng dụng hoặc bởi các ứng dụng cụ thể khác với shell là các biến môi trường. Dưới đây là một vài ví dụ về các biến môi trường phổ biến:

  • HOME- cho biết thư mục chính của người dùng, nơi chứa các tệp cấu hình của mỗi người dùng. Được sử dụng bởi bất kỳ chương trình nào đọc các tệp cấu hình của mỗi người dùng hoặc nếu không cần phải biết vị trí của thư mục chính của người dùng.
  • PATH- chỉ ra nơi tìm các tập tin thực thi để khởi chạy các chương trình khác. Được sử dụng bởi mọi chương trình cần bắt đầu một chương trình khác.
  • LD_LIBRARY_PATH- chỉ ra nơi để tìm các tệp thư viện động. Được sử dụng bởi mọi thực thi liên kết động.
  • EDITOR, VISUAL- cho biết chương trình nào sẽ chạy khi cần trình chỉnh sửa. Được sử dụng bởi bất kỳ chương trình nào cần khởi chạy trình soạn thảo văn bản.
  • DISPLAY, XAUTHORITY- cho biết cách kết nối với máy chủ X11. Được sử dụng bởi các máy khách X11 (tức là các chương trình GUI).
  • LESS- tùy chọn tự động bật khi lessđược chạy. Được sử dụng bởi less.
  • http_proxy- cho biết proxy web sẽ sử dụng. Được sử dụng bởi hầu hết các trình duyệt web.

Không sử dụng exportcho các biến shell. Biến Shell là một tính năng của shell như một ngôn ngữ lập trình. Các biến shell chỉ được sử dụng bên trong shell nơi chúng được đặt; chúng không có ý nghĩa đối với các chương trình được khởi chạy bởi shell. Các biến shell được nhân đôi khi một lớp con được tạo, giống như phần còn lại của trạng thái shell. Dưới đây là một vài ví dụ về các biến shell có ý nghĩa đối với các shell phổ biến:

  • PS1 - lời nhắc hiển thị trước mỗi lệnh.
  • IFS - các ký tự phân tách các từ trong phần mở rộng biến không được trích dẫn và thay thế lệnh.
  • HISTFILE - một tập tin trong đó shell sẽ ghi lịch sử lệnh.

Ngoài các biến được sử dụng bởi shell, hầu hết các script shell đều sử dụng các biến cho mục đích nội bộ của chúng.

Hầu hết các biến môi trường (ví dụ PATH) có ý nghĩa cho toàn bộ phiên và nên được đặt trong ~/.profilehoặc một tệp tương tự. Các biến chỉ có ý nghĩa đối với một vỏ cụ thể (ví dụ PS1) nên được đặt trong một tệp dành riêng cho vỏ như ~/.bashrchoặc ~/.zshrc. Xem Có tệp tương đương ".bashrc" được đọc bởi tất cả các shell không?


3

Đối với các biến nội bộ bash bạn không cần export. Từ ví dụ của bạn HISTTIMEFORMATđược sử dụng bởi chính bash và không cần xuất MYSQL_HISTFILElà cho mysqlvà cần phải xuất nếu mysqlkhông thì không thấy.

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.