Tôi sử dụng một tập lệnh (mà tôi không có quyền truy cập ghi) để tạo ra một loạt các bí danh để thiết lập một môi trường. Tôi muốn tạo một hàm bash để thiết lập môi trường của mình, nhưng có vẻ như các bí danh không tồn tại với thân hàm.
Đây là một ví dụ tối thiểu:
# aliases.sh
alias fooAlias='echo "this will never work!"'
.
# .bashrc
function setupLotsOfThings() {
source aliases.sh
fooAlias
}
.
Bây giờ, nếu tôi chỉ đơn giản là nguồn aliases.shtương tác, mọi thứ hoạt động như mong đợi:
[mycomputer]~/ $ source aliases.sh
[mycomputer]~/ $ fooAlias
this will never work!
Tuy nhiên, nếu tôi gọi hàm được định nghĩa trong .bashrc của mình, thì nó không nhận ra bí danh sau khi tìm nguồn gốc định nghĩa của nó:
[mycomputer]~/ $ setupLotsOfThings
-bash: fooAlias: command not found
Chuyện gì đang xảy ra ở đây? Có điều gì tôi đang thiếu về phạm vi của aliaslệnh khi được sử dụng trong một hàm không?
Chỉnh sửa: Tôi sẽ thêm một số chi tiết ngoài ví dụ tối thiểu để làm sáng tỏ những gì tôi đang cố gắng thực hiện.
Đối với công việc của tôi, tôi phát triển và chạy rất nhiều phần mềm trên một cụm và / hoặc lưới. Tôi có một số dự án yêu cầu các môi trường hoàn toàn khác nhau, chẳng hạn như các phiên bản gcc khác nhau, bản phát hành phần mềm cụ thể, PATH cấu hình và dữ liệu và các biến môi trường khác nhau. Quản trị viên cung cấp các tập lệnh để thiết lập nhiều thứ khác nhau, thường là bằng cách xác định các hàm shell hoặc bí danh, gọi các hàm hoặc bí danh khác hoặc chạy các tập lệnh khác nhau. Đối với tôi, đó là một hộp đen.
Tôi muốn thiết lập các môi trường khác nhau của riêng tôi với một lệnh duy nhất. Hiện tại, tôi làm một cái gì đó như:
[mycomputer]~/ $ source /some/environment/setup/script.sh
[mycomputer]~/ $ aliasToSetupSomeSoftwareVersion #this was defined in the above
[mycomputer]~/ $ anotherAliasForOtherSoftware
[mycomputer]~/ $ source /maybe/theres/another/script.sh
[mycomputer]~/ $ runSomeOtherSetup # this was defined in the new script
Các lệnh này thường phải được chạy theo thứ tự. Ý tưởng của tôi về cơ bản là chỉ sao chép các dòng trên vào một khối chức năng, nhưng như ví dụ ban đầu cho thấy, đơn giản là nó không hoạt động. Giải pháp thay thế được chào đón nhiều hơn!