Modifica della directory di lavoro dello script principale dallo script "di provenienza"


2

Voglio cambiare la directory di lavoro del mio script con un altro script che è stato incluso.

Primo copione:

#!/bin/bash
pwd
source script2
pwd

Sceneggiatura Sedond:

cd ..
pwd

Il risultato è il seguente:

> ./script1
/home/sebi/testdir1/testdir2  # 1st script
/home/sebi/testdir1           # 2nd script
/home/sebi/testdir1           # 1st script

Ho modificato la domanda mentre ho testato questo script e ha funzionato come volevo, tuttavia lo script seguente funziona in modo diverso, poiché il pedice termina l'esecuzione il genitore si trova nella stessa directory di prima del richiamo del pedice.

#!/bin/bash
while :
do
sleep 5  

cat /home/.../shelldata.txt >> /home/.../gmodshell #logging

((source /home/..../shelldata.txt) 2>&1) | \
sed -e "s/..shellRunner.sh..line../SH/" > \
/home/..../shellFeedback.txt

echo > /home/..../shelldata.txt

done

Lo scopo è quello di accedere a bash usando i file in modo da poter scrivere il comando su un file e dopo un po 'ottengo l'output in un altro file.


1
Funziona bene per me se faccio esattamente la stessa cosa.
Sebastian Paaske Tørholm,

Risposte:


5

Supponendo che gli script 1 e 2 siano nella stessa directory, prova a creare lo script 1:

#!/bin/bash
pwd
. ./script2
pwd

Posizionare il punto prima della chiamata allo script (sto parlando del primo punto, non del punto che fa parte del percorso del file per lo script che si desidera chiamare) dice alla shell "Eseguire il seguente script in questo processo piuttosto che spawn un nuovo processo per questo ".

Le azioni intraprese nel secondo script (come il cd-ing o l'impostazione delle variabili) persisteranno dopo la fine del secondo script.


2

Dalla bashdocumentazione:

Sostituzione dei comandi, comandi raggruppati con parentesi e comandi asincroni vengono richiamati in un ambiente subshell che è un duplicato dell'ambiente shell, tranne per il fatto che le trap catturate dalla shell vengono reimpostate sui valori che la shell ha ereditato dal suo genitore durante l'invocazione. I comandi incorporati che vengono richiamati come parte di una pipeline vengono eseguiti anche in un ambiente subshell. Le modifiche apportate all'ambiente subshell non possono influire sull'ambiente di esecuzione della shell.

Quindi dovresti evitare di mettere parentesi durante il sourcing di un file con il .comando (punto) (come menzionato in questa risposta ).


1

Questo non è specifico per l'approvvigionamento di uno script. Otterresti esattamente lo stesso risultato con un singolo script. Provare:

#!/bin/bash
pwd
cd ..
pwd

Il motivo è che uno script avviato viene eseguito in una subshell. Quando lo script ritorna, la subshell viene chiusa e si ritorna alla shell originale, ovunque ci si trovasse nello script.

Se vuoi che un comando ti trascini in un'altra directory, dovresti invece usare un alias o una funzione bash:

function script1 () { cd ..; }

il secondo script è dinamico, riceve comandi dall'origine remota. Esiste un modo invece di sourceincludere altri file come verrebbero eseguiti dallo stesso file, tipo di inline include?
Sebi,

@Sebi: puoi chiarire il tuo bisogno / architettura?
inkaphink,

Ho testato esattamente lo stesso script che avevo inizialmente pubblicato nella domanda e ha funzionato come lo desideravo, tuttavia lo script che ho aggiunto non funziona correttamente. (come volevo che facessi) Sono su Fedora 14. Quello che voglio ottenere è eseguire comandi remoti (scritti su file) e dare output in un altro file in modo da poter accedere a bash usando le funzioni dei file, so quanto sia inefficace è, ma l'unico modo per comunicare è usare le funzioni dei file.
Sebi,

1

Non ha senso usare il comando source se lo si fa in una subshell come nel secondo script:

((source /home/..../shelldata.txt) 2>&1) | \

Inoltre, shelldata.txt è davvero uno script di shell, quindi dargli un'estensione .txt, sebbene non proibita, è fonte di confusione.

Infine, sarebbe utile dire cosa contiene shelldata.txt per capire come rispondere alla tua domanda.


0

È possibile utilizzare lo script di origine per impostare una variabile e fare in modo che la variabile originale apporti la modifica in base al contenuto della variabile anziché effettuare la modifica direttamente nello script di provenienza?


Ma la variabile non esisterebbe dopo la fine del secondo script, il che significa che deve essere eseguita nel processo corrente, usando il comando punto. E se hai intenzione di farlo in questo modo (eseguilo nel processo corrente), puoi anche semplicemente fare il cd, piuttosto che impostare una variabile e poi cd in esso.
Cam Jackson
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.