Muat ulang. Profil dalam skrip bash shell (di unix)?

130

Saya baru mengenal bash scripting, dan telah menghadapi tantangan. Saya tahu saya dapat memuat ulang file ".profile" saya dengan hanya melakukan:

. .profile

tapi saya mencoba untuk mengeksekusi yang sama dalam skrip bash yang saya tulis dan itu tidak berfungsi. Ada ide? Ada lagi yang bisa saya berikan untuk menjelaskan?

Terima kasih

Amir Rustamzadeh
sumber
Seperti yang ditunjukkan Ignacio di bawah, skrip Anda berjalan dalam subkulit. Subkulit tidak dapat memodifikasi shell utama (proses anak tidak dapat memodifikasi induknya). Jadi, Anda perlu "sumber" skrip dengan menggunakan "." perintah (yang juga bisa dieja sebagai "sumber"). Jadi, jika skrip Anda ingin, misalnya, memodifikasi variabel lingkungan, Anda perlu melakukan sesuatu seperti "source myscript" atau ". Myscript" (keduanya berarti hal yang sama). Ini akan mengubah lingkungan shell utama Anda. (Yang saya pikir adalah apa yang Anda coba lakukan, beri tahu saya jika ini salah.)
bstpierre
1
Saya mendapat jawaban dari pertanyaan Anda :)
Kolob Canyon

Jawaban:

195

Coba ini untuk memuat ulang shell Anda saat ini:

source ~/.profile
kofriel
sumber
1
Apakah Anda punya solusi alternatif? Karena menggunakan sourceperintah akan menjalankan file sebagai skrip ... Dalam kasus terburuk, jika seseorang akan menggunakan tugas variabel seperti MyVar="$foo$MyVar"di bash_profile mereka, maka source ~/.profileakan memberikan hasil akhir MyVar="$foo$MyVar$MyVar", maka $MyVarakan memiliki nilai yang salah sesudahnya. (Terlepas dari praktik buruk, minta solusi alternatif)
Jeffrey Mvutu Mabilama
9

Coba ini:

cd 
source .bash_profile
girardengo
sumber
5

Beberapa masalah muncul ketika mencoba memuat ulang / source ~ / .profile file. [Ini merujuk ke Ubuntu linux - dalam beberapa kasus detail dari perintah akan berbeda]

  1. Apakah Anda menjalankan ini langsung di terminal atau dalam skrip?
  2. Bagaimana Anda menjalankan ini dalam skrip?

Iklan. 1)

Menjalankan ini secara langsung di terminal berarti bahwa tidak akan ada subkulit yang dibuat. Jadi, Anda dapat menggunakan dua perintah:

source ~/.bash_profile

atau

. ~/.bash_profile

Dalam kedua kasus ini akan memperbarui lingkungan dengan isi file profil.

Iklan 2) Anda dapat memulai skrip bash apa pun dengan menelepon

sh myscript.sh 

atau

. myscript.sh

Dalam kasus pertama ini akan membuat subkulit yang tidak akan memengaruhi variabel lingkungan sistem Anda dan hanya akan terlihat pada proses subkulit. Setelah menyelesaikan perintah subshell, tidak ada ekspor dll tidak akan diterapkan. INI ADALAH KESALAHAN UMUM DAN MENYEBABKAN BANYAK PENGEMBANG UNTUK KEHILANGAN BANYAK WAKTU.

Agar perubahan yang diterapkan pada skrip Anda memiliki efek untuk lingkungan global, skrip harus dijalankan

.myscript.sh

perintah.

Untuk memastikan bahwa skrip Anda tidak dijalankan di subshel, Anda dapat menggunakan fungsi ini. (Sekali lagi contoh untuk shell 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
}

Saya harap ini menghapus beberapa kesalahpahaman umum! : D Semoga Sukses!

twboc
sumber
4

Script bash berjalan dalam subkulit terpisah. Untuk membuat ini berfungsi, Anda perlu sumber skrip lain ini juga.

Ignacio Vazquez-Abrams
sumber
Saya tidak yakin (masih baru untuk semua ini) apa yang sebenarnya Anda maksud dengan "sumber" -s script lain. Bisa tolong sedikit mengembangkannya. Namun saya sudah mencoba: $. ~ / .profile $. / etc / profile tanpa hasil. Terima kasih banyak.
Amir Rustamzadeh
1
@amirrustan: Skrip Anda perlu sumber .profilefile Anda sesuatu seperti ini: . $HOME/.profiledan Anda harus memulai skrip Anda dengan sumber juga. Sesuatu seperti. /path/to/yourscript
Dijeda sampai pemberitahuan lebih lanjut.
1
@amirrustam, silakan baca superuser.com/questions/176783/…
lesmana
1

Mencoba:

#!/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 "$@"
tilo
sumber