โหลด. profile ใหม่ใน bash shell script (ใน unix)?


130

ฉันยังใหม่กับ bash shell scripting และเจอความท้าทาย ฉันรู้ว่าสามารถโหลดไฟล์ ".profile" ของฉันซ้ำได้โดยทำดังนี้

. .profile

แต่ฉันพยายามดำเนินการแบบเดียวกันในสคริปต์ทุบตีที่ฉันเขียนและมันใช้งานไม่ได้ ความคิดใด ๆ ? มีอะไรอีกที่ฉันสามารถให้เพื่อชี้แจง?

ขอบคุณ


ดังที่ Ignacio ชี้ให้เห็นด้านล่างสคริปต์ของคุณกำลังทำงานใน subshell subshell ไม่สามารถแก้ไขเชลล์หลัก (กระบวนการลูกไม่สามารถแก้ไขพาเรนต์ได้) ดังนั้นคุณต้อง "ซอร์ส" สคริปต์โดยใช้ "." คำสั่ง (ซึ่งสามารถสะกดเป็น "source" ได้ด้วย) ดังนั้นหากสคริปต์ของคุณต้องการกล่าวแก้ไขตัวแปรสภาพแวดล้อมคุณต้องทำบางอย่างเช่น "source myscript" หรือ ". myscript" (ทั้งสองหมายถึงสิ่งเดียวกัน) สิ่งนี้จะปรับเปลี่ยนสภาพแวดล้อมของเชลล์หลักของคุณ (ซึ่งฉันคิดว่านั่นคือสิ่งที่คุณกำลังพยายามทำโปรดแจ้งให้เราทราบหากสิ่งนี้ผิด)
bstpierre

1
ฉันได้รับคำตอบจากคำถามของคุณ :)
Kolob Canyon

คำตอบ:


195

ลองทำเช่นนี้เพื่อโหลดเชลล์ปัจจุบันของคุณใหม่:

source ~/.profile

1
คุณมีทางเลือกอื่นหรือไม่? เนื่องจากการใช้sourceคำสั่งจะเรียกใช้ไฟล์เป็นสคริปต์ ... ในกรณีที่เลวร้ายที่สุดหากมีคนใช้การกำหนดตัวแปรเช่นMyVar="$foo$MyVar"ใน bash_profile ของพวกเขาก็source ~/.profileจะให้ผลลัพธ์สุดท้ายMyVar="$foo$MyVar$MyVar"ดังนั้น$MyVarจะมีค่าที่ไม่ถูกต้องในภายหลัง (โดยไม่คำนึงถึงแนวทางปฏิบัติที่ไม่ดีเพียงแค่ขอทางเลือกอื่น)
Jeffrey Mvutu Mabilama


5

ปัญหาสองประการเกิดขึ้นเมื่อพยายามโหลดไฟล์ / source ~ / .profile ซ้ำ [หมายถึง Ubuntu linux - ในบางกรณีรายละเอียดของคำสั่งจะแตกต่างกัน]

  1. คุณเรียกใช้สิ่งนี้โดยตรงในเทอร์มินัลหรือในสคริปต์หรือไม่?
  2. คุณเรียกใช้สิ่งนี้ในสคริปต์ได้อย่างไร

การโฆษณา 1)

การรันสิ่งนี้โดยตรงในเทอร์มินัลหมายความว่าจะไม่มีการสร้าง subshell ดังนั้นคุณสามารถใช้สองคำสั่ง:

source ~/.bash_profile

หรือ

. ~/.bash_profile

ในทั้งสองกรณีนี้จะอัปเดตสภาพแวดล้อมด้วยเนื้อหาของไฟล์. profile

โฆษณา 2) คุณสามารถเริ่มสคริปต์ทุบตีโดยการโทร

sh myscript.sh 

หรือ

. myscript.sh

ในกรณีแรกสิ่งนี้จะสร้าง subshell ที่จะไม่ส่งผลกระทบต่อตัวแปรสภาพแวดล้อมของระบบของคุณและจะมองเห็นได้เฉพาะในกระบวนการ subshell เท่านั้น หลังจากเสร็จสิ้นคำสั่ง subshell จะไม่มีการส่งออก ฯลฯ ใด ๆ จะไม่ถูกนำไปใช้ นี่เป็นความผิดพลาดทั่วไปและเป็นสาเหตุให้นักพัฒนาจำนวนมากเสียเวลาไปมาก

เพื่อให้การเปลี่ยนแปลงของคุณที่ใช้ในสคริปต์ของคุณมีผลกับสภาวะแวดล้อมส่วนกลางสคริปต์จะต้องถูกรันด้วย

.myscript.sh

คำสั่ง

เพื่อให้แน่ใจว่าสคริปต์ของคุณไม่ได้ถูกรันใน subshel ​​คุณสามารถใช้ฟังก์ชันนี้ได้ (ตัวอย่างอีกครั้งสำหรับ Ubuntu shell)

#/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
}

ฉันหวังว่าสิ่งนี้จะช่วยขจัดความเข้าใจผิดที่พบบ่อยได้! : D ขอให้โชคดี!


4

สคริปต์ bash ทำงานใน subshell แยกต่างหาก ในการทำงานนี้คุณจะต้องจัดหาสคริปต์อื่นนี้ด้วย


ฉันไม่แน่ใจว่า (ยังใหม่สำหรับทั้งหมดนี้) ว่าคุณหมายถึงอะไรโดย "แหล่งที่มา" ซึ่งเป็นสคริปต์อื่น โปรดขยายความเล็กน้อย อย่างไรก็ตามฉันได้ลอง: $. ~ / .profile $. / etc / profile โดยไม่ประสบความสำเร็จ ขอบคุณมาก.
Amir Rustamzadeh

1
@amirrustan: สคริปต์ของคุณจะต้องจัดหา.profileไฟล์ของคุณในลักษณะนี้: . $HOME/.profileและคุณจะต้องเริ่มสคริปต์ของคุณโดยการจัดหาไฟล์ด้วย สิ่งที่ชอบ. /path/to/yourscript
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบอีกครั้ง

1
@amirrustam โปรดอ่านsuperuser.com/questions/176783/…
lesmana

1

ลอง:

#!/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 $@
echo my script continues here
' arg0 "$@"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.