Ricarica .profile in bash shell script (in unix)?


130

Sono nuovo di bash scripting shell, e ho incontrato una sfida. So di poter ricaricare il mio file ".profile" semplicemente facendo:

. .profile

ma sto cercando di eseguire lo stesso in uno script bash che sto scrivendo e non funziona. Qualche idea? Qualcos'altro che posso fornire per chiarire?

Grazie


Come indicato da Ignacio di seguito, lo script è in esecuzione in una subshell. La subshell non può modificare la shell principale (il processo figlio non può modificare il suo genitore). Quindi devi "fonte" lo script usando il "." comando (che può anche essere scritto come "fonte"). Quindi, se il tuo script vuole, per esempio, modificare le variabili di ambiente, devi fare qualcosa come "source myscript" o ". Myscript" (entrambi significano la stessa cosa). Questo modificherà l'ambiente della shell principale. (Il che penso sia quello che stai cercando di fare, fammi sapere se questo è sbagliato.)
bstpierre

1
Ho ricevuto la mia risposta dalla tua domanda :)
Kolob Canyon,

Risposte:


195

Prova questo per ricaricare la tua shell corrente:

source ~/.profile

1
Hai una soluzione alternativa? Perché l'uso del sourcecomando eseguirà il file come uno script ... Nel peggiore dei casi, se qualcuno usasse un'assegnazione variabile come MyVar="$foo$MyVar"nel proprio profilo bash, allora source ~/.profiledarebbe il risultato finale MyVar="$foo$MyVar$MyVar", quindi $MyVaravrebbe un valore sbagliato in seguito. (Indipendentemente dalle cattive pratiche, basta chiedere una soluzione alternativa)
Jeffrey Mvutu Mabilama,


5

Un paio di problemi sorgono quando si tenta di ricaricare il file / source ~ / .profile. [Questo si riferisce a Ubuntu Linux - in alcuni casi i dettagli dei comandi saranno diversi]

  1. Lo stai eseguendo direttamente nel terminale o in uno script?
  2. Come si esegue questo in uno script?

Anno Domini. 1)

Eseguirlo direttamente nel terminale significa che non ci sarà alcuna subshell creata. Quindi puoi usare due comandi:

source ~/.bash_profile

o

. ~/.bash_profile

In entrambi i casi questo aggiornerà l'ambiente con il contenuto del file .profile.

Annuncio 2) Puoi iniziare qualsiasi script bash chiamando

sh myscript.sh 

o

. myscript.sh

Nel primo caso ciò creerà una subshell che non influirà sulle variabili di ambiente del sistema e saranno visibili solo al processo della subshell. Dopo aver completato il comando subshell nessuna delle esportazioni ecc. Non verrà applicata. QUESTO È UN ERRORE COMUNE E CAUSA MOLTI SVILUPPI PER PERDERE MOLTO TEMPO.

Affinché le modifiche applicate nello script abbiano effetto per l'ambiente globale con cui lo script deve essere eseguito

.myscript.sh

comando.

Per assicurarsi che lo script non sia eseguito in un subshel ​​è possibile utilizzare questa funzione. (Ancora un esempio è per la 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
}

Spero che questo cancelli alcuni dei malintesi comuni! : D Buona fortuna!


4

Lo script bash viene eseguito in una subshell separata. Per far funzionare tutto questo dovrai procurarti anche questo altro script.


Non sono sicuro (ancora nuovo in tutto questo) cosa intendi esattamente per "fonte", come l'altro script. Potresti per favore espandere un po 'su questo. Comunque ho provato: $. ~ / .profile $. / etc / profile senza successo. Grazie mille.
Amir Rustamzadeh,

1
@amirrustan: il tuo script dovrà procurarti il .profilefile in questo modo: . $HOME/.profilee dovrai avviare il tuo script anche acquistandolo. Qualcosa del genere. /path/to/yourscript
In pausa fino a nuovo avviso.


1

Provare:

#!/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 "$@"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.