Esegui lo script nella shell corrente senza. prima del comando


26

Se uno script deve essere eseguito nella shell corrente, può essere ottenuto aggiungendo un punto prima del comando:

   . ./somescript.sh

C'è un modo per farlo senza digitare il punto ogni volta? Ad esempio un comando per passare alla shell padre dallo script stesso?

Risposte:


22

Potrebbe non essere esattamente quello che vuoi ma potresti fare:

alias somescript.sh='. ./somescript.sh'

2
Questo ha risolto perfettamente il mio problema. Grazie!
alu,

8

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 bashsubshell). Pertanto le modifiche apportate somescript.shal 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.


Grazie per la spiegazione dettagliata. :) Ora vedo che non è possibile farlo dallo script chiamato, ma fortunatamente si può dire alla shell genitore di non creare una subshell con il aliascomando, come suggerito da Scott.
alu,

1

Se eseguito ./somescript.shcome 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.


0

Penso che lo script che stai cercando di eseguire non sia eseguibile. chmod a+x somescript.shaggiungerà 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.shti 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.


Gli script stessi funzionano bene, ma voglio eseguirlo nella shell corrente per poter modificare le variabili di ambiente della shell.
alu,

Se l'esportazione della variabile desiderata nello script non funziona, ad esempio export PATH=$PATH:/usr/local/binaggiungere / 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.shsta eseguendo bene: stai usando il comando dot per eseguire il sorgente in un file. tcsh usa "source" per la stessa cosa.
AR Diederich,

La modifica di una variabile era solo un esempio. La mia domanda è se è possibile dire alla shell che dovrebbe esserci un punto senza effettivamente scriverlo (ad esempio dallo script stesso)
alu,

Il punto potrebbe essere facilmente dimenticato, il che può cambiare completamente il comportamento dello script.
alu,

0
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 ./


1
L'OP chiede il primo, .non quello ./che fa parte del nome file. L'esecuzione di ./somescript non lo esegue nella shell corrente come . ./somescriptfa.
Anthon,
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.