Câu trả lời:
Có cách nào để làm điều này mà không cần gõ dấu chấm mỗi lần không? Ví dụ một lệnh để thay đổi sang shell cha từ chính tập lệnh?
Tôi không nghĩ là có (ngoài việc gõ source somescript.sh
, nhưng đó có lẽ không phải là thứ bạn đang tìm kiếm ^^).
Nếu bạn chạy tập lệnh như bình thường với ./somescript.sh
, thì shell forks và thực thi lệnh này. Nó truyền lệnh cho kernel và sau đó kernel quyết định cách thực hiện lệnh này bằng cách phân tích #!
dòng bên trong script. Sau đó, kernel khởi chạy trình thông dịch đã chỉ định (trong trường hợp này có thể là một bash
lớp con). Do đó, các sửa đổi somescript.sh
đối với môi trường của nó được phân lập trong lớp con mà không ảnh hưởng đến lớp vỏ mẹ.
Nếu bạn muốn shell tự đọc tập lệnh mà không khởi chạy một tiến trình khác, bạn rõ ràng phải nói với nó bằng cách sử dụng từ khóa .
hoặc source
.
alias
lệnh, như scott đề xuất.
Nếu bạn thực thi ./somescript.sh
như một chương trình bên ngoài, nó không thể làm bất cứ điều gì trong quy trình shell đang chạy, chẳng hạn như truy cập các biến không xuất, đặt biến, thay đổi thư mục hiện tại, v.v. Không có cách nào khác.
(Chà, ok, bạn có thể chạy trình gỡ lỗi từ quy trình con và điều chỉnh bộ nhớ của tiến trình cha. Nhưng nếu bạn thử nó, kết quả rất có thể là làm hỏng vỏ cha.)
Bạn cần phải chạy . ./somescript.sh
. Bạn có thể ẩn nó đằng sau một bí danh hoặc hàm nếu bạn muốn, nhưng một lần nữa định nghĩa bí danh hoặc hàm phải được thực hiện trong vỏ cha.
Tôi nghĩ rằng kịch bản bạn đang cố chạy không thể thực thi được. chmod a+x somescript.sh
sẽ thêm bit thực thi cho người dùng, nhóm và (ugo) khác vào tệp đó. Dòng đầu tiên của tệp cũng sẽ cần #! dòng ở trên cùng, thích #!/bin/bash
.
ls -l somescript.sh
sẽ hiển thị cho bạn các bộ ba rwx (đọc / ghi / thực thi) cho tệp. Nó sẽ cần một x trong ít nhất là tập đầu tiên, giả sử bạn sở hữu tệp.
export PATH=$PATH:/usr/local/bin
thêm / usr / local / bin vào $ PATH của bạn, thì bạn cần phải lấy nguồn để thay đổi các biến môi trường đang chạy của mình. Câu hỏi này thực sự là "Làm thế nào để tôi lập trình thay đổi các biến môi trường trong shell đang chạy của mình từ tập lệnh bash?" Kịch bản . ./somescript.sh
đang thực thi tốt - bạn đang sử dụng lệnh dot để nguồn trong một tệp. tcsh sử dụng "nguồn" cho cùng một thứ.
export PATH=$PATH:.
Chạy lệnh đó trong shell hoặc thêm nó vào tệp cấu hình shell của bạn sẽ nối thêm thư mục hiện tại vào biến PATH. Biến PATH là một danh sách các thư mục mà shell của bạn sẽ tìm kiếm nhị phân để thực thi khi bạn đưa ra lệnh.
Điều này sẽ cho phép bạn chạy bất kỳ thực thi trong thư mục hiện tại mà không cần ./
.
không phải ./
là một phần của tên tệp. Chạy ./somescript không thực thi nó trong trình bao hiện tại . ./somescript
.