Risposte:
C'è un modo per farlo senza digitare il punto ogni volta? Ad esempio un comando per passare alla shell padre dallo script stesso?
Non penso che ci sia (a parte scrivere source somescript.sh
, ma probabilmente non è quello che stai cercando ^^).
Se esegui lo script come al solito con ./somescript.sh
, la shell esegue il fork e esegue questo comando. Passa il comando al kernel e quindi il kernel decide come eseguire questo comando analizzando la #!
riga all'interno dello script. Il kernel avvia quindi l'interprete specificato (in questo caso probabilmente una bash
subshell). Pertanto le modifiche apportate somescript.sh
al suo ambiente vengono isolate nella subshell senza influire sulla shell padre.
Se vuoi che la shell legga lo script stesso senza avviare un altro processo, devi dirlo esplicitamente usando la parola chiave .
o source
.
alias
comando, come suggerito da Scott.
Se eseguito ./somescript.sh
come programma esterno, non può fare nulla all'interno del processo della shell in esecuzione, come accedere alle variabili non esportate, impostare le variabili, cambiare la directory corrente, ecc.
(Bene, ok, potresti essere in grado di eseguire un debugger dal sottoprocesso e modificare la memoria del processo parent. Ma se lo provi, il risultato più probabile è l'arresto anomalo della shell parent.)
Devi correre . ./somescript.sh
. Se lo desideri, puoi nasconderlo dietro un alias o una funzione, ma ancora una volta l'alias o la definizione della funzione devono essere eseguiti nella shell genitore.
Penso che lo script che stai cercando di eseguire non sia eseguibile. chmod a+x somescript.sh
aggiungerà il bit di esecuzione per utente, gruppo e altro (ugo) a quel file. La prima riga del file avrà bisogno anche del #! linea in alto, come #!/bin/bash
.
ls -l somescript.sh
ti mostrerà le terzine rwx (leggi / scrivi / esegui) per il file. Avrà bisogno di una x almeno nel primo set, supponendo che tu sia il proprietario del file.
export PATH=$PATH:/usr/local/bin
aggiungere / usr / local / bin al $ PATH, è necessario eseguire il sorgente del file per modificare le variabili dell'ambiente in esecuzione. Questa domanda è davvero "Come posso modificare a livello di codice le variabili di ambiente nella mia shell in esecuzione da uno script bash?" Lo script . ./somescript.sh
sta eseguendo bene: stai usando il comando dot per eseguire il sorgente in un file. tcsh usa "source" per la stessa cosa.
export PATH=$PATH:.
L'esecuzione di quel comando nella shell o l'aggiunta al file di configurazione della shell aggiungerà la directory corrente alla variabile PATH. La variabile PATH è un elenco di directory in cui la shell cercherà i binari da eseguire quando si emette un comando.
Ciò ti consentirà di eseguire qualsiasi eseguibile nella directory corrente senza ./
.
non quello ./
che fa parte del nome file. L'esecuzione di ./somescript non lo esegue nella shell corrente come . ./somescript
fa.