2010-07-18 39 views
98

Tôi là người mới để bash shell scripting và đã gặp phải một thách thức. Tôi biết tôi có thể tải lại tệp ".profile" của mình chỉ bằng cách thực hiện:Tải lại .profile trong bash shell script (trong unix)?

. .profile 

nhưng tôi đang cố gắng thực hiện tương tự trong tập lệnh bash mà tôi đang viết và nó không hoạt động. Bất kỳ ý tưởng nào? Bất cứ điều gì khác tôi có thể cung cấp để làm rõ?

Cảm ơn

+0

Như Ignacio chỉ ra bên dưới, tập lệnh của bạn đang chạy trong một vỏ con. Subshell không thể sửa đổi shell chính (quá trình con không thể thay đổi parent của nó). Vì vậy, bạn cần phải "nguồn" kịch bản bằng cách sử dụng "." lệnh (cũng có thể được viết là "nguồn"). Vì vậy, nếu kịch bản của bạn muốn, nói, sửa đổi các biến môi trường, bạn cần phải làm một cái gì đó như "nguồn myscript" hoặc ". Myscript" (cả hai đều có nghĩa là cùng một điều). Điều này sẽ sửa đổi môi trường shell chính của bạn. (Mà tôi nghĩ là những gì bạn đang cố gắng làm, hãy cho tôi biết nếu điều này là sai.) – bstpierre

+1

Tôi nhận được câu trả lời từ câu hỏi của bạn :) –

Trả lời

149

Hãy thử điều này để tải lại vỏ hiện tại của bạn:

source ~/.profile 
3

Tập lệnh bash chạy trong một vỏ con riêng biệt. Để thực hiện công việc này, bạn cũng cần phải viết mã cho tập lệnh khác này.

+0

Tôi không chắc chắn (vẫn còn mới cho tất cả điều này) những gì bạn chính xác có nghĩa là bởi "source" - viết kịch bản khác. Xin vui lòng mở rộng một chút về điều đó. Tuy nhiên tôi đã thử: $. ~/.profile $./etc/profile không thành công. Cảm ơn bạn rất nhiều. –

+1

@amirrustan: Tập lệnh của bạn sẽ cần nguồn của tệp '.profile' của bạn như sau:'. $ HOME/.profile' và bạn sẽ cần phải bắt đầu kịch bản của bạn bằng cách tìm nguồn cung ứng nó cũng. Một cái gì đó như './path/to/yourscript' –

+1

@amirrustam vui lòng đọc http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a-bash- script/176788 # 176788 – lesmana

0

Hãy thử:

#!/bin/bash 
# .... some previous code ... 
# help set exec | less 
set -- 1 2 3 4 5 # fake command line arguments 
exec bash --login -c ' 
echo $0 
echo [email protected] 
echo my script continues here 
' arg0 "[email protected]" 
6

Hãy thử điều này:

cd 
source .bash_profile 
1

Một vài vấn đề nảy sinh khi cố gắng tải lại/nguồn ~ /.profile. [Điều này đề cập đến Linux Ubuntu - trong một số trường hợp, chi tiết của các lệnh sẽ khác nhau]

  1. Bạn có chạy trực tiếp trong thiết bị đầu cuối hoặc trong tập lệnh không?
  2. Làm thế nào để bạn chạy điều này trong một tập lệnh?

Quảng cáo. 1)

Chạy trực tiếp điều này trong thiết bị đầu cuối có nghĩa là sẽ không có vỏ bọc nào được tạo. Vì vậy, bạn có thể sử dụng hai lệnh:

source ~/.bash_profile 

hoặc

. ~/.bash_profile 

Trong cả hai trường hợp này sẽ cập nhật các môi trường với các nội dung của file .profile.

Quảng cáo 2) Bạn có thể bắt đầu bất kỳ kịch bản bash hoặc bằng cách gọi

sh myscript.sh 

hoặc

. myscript.sh 

Trong trường hợp đầu tiên này sẽ tạo ra một subshell đó sẽ không ảnh hưởng đến các biến môi trường của bạn hệ thống và chúng sẽ chỉ hiển thị cho quá trình bán vỏ. Sau khi hoàn thành lệnh subshell, không có phần tử xuất khẩu nào vv sẽ không được áp dụng. ĐÂY LÀ MỘT MÔ PHỎNG VÀ NHỮNG NGUYÊN NHÂN CHUNG LỚN CỦA CÁC NHÀ PHÁT TRIỂN ĐỂ TẤT CẢ LẦN THỜI GIAN.

Để thay đổi của bạn áp dụng trong kịch bản của bạn để có hiệu lực đối với môi trường toàn cầu kịch bản phải được chạy với

.myscript.sh 

lệnh.

Để đảm bảo rằng tập lệnh của bạn không được chạy trong một khung con, bạn có thể sử dụng chức năng này. (Ví dụ lần nữa là dành cho vỏ Ubuntu)

#/bin/bash 

preventSubshell(){ 
    if [[ $_ != $0 ]] 
    then 
    echo "Script is being sourced" 
    else 
    echo "Script is a subshell - please run the script by invoking . script.sh command"; 
    exit 1; 
    fi 
} 

Tôi hy vọng điều này sẽ xóa một số hiểu lầm phổ biến! : D Chúc may mắn!