modifica della directory di lavoro corrente con uno script


8

Ho letto questa domanda e la risposta, ma non si adatta perfettamente al mio problema, anche se è simile.

Sto scrivendo una sceneggiatura (chiamata cpj) che lancerà uno dei miei progetti attuali. Ne ho circa 5. Quando scrivo

$ cpj blah

Voglio che l'attuale directory di lavoro cambi nella directory del progetto blah (che tengo in $ PROJDIR) e voglio che emacsclient apra il file principale per quel progetto (che tengo in $ MAINFILE).

La domanda che ho citato dice che non puoi cambiare direttamente l'ambiente della shell che esegue lo script, ma puoi procurartene uno e lo farà.

Per provare questo ho scritto uno script di shell (chiamato chcwd) che ha una riga:

cd $1

Se, dalla riga di comando, faccio:

$ . chcwd $PROJDIR

la mia directory di lavoro corrente cambierà come desidero. Se, d'altra parte, dal mio script cpj, ho la stessa riga:

. chcwd $PROJECT

non cambierà la directory di lavoro corrente della shell. Mi rendo conto che sto eseguendo 2 script (cpj e poi chcwd), e quindi creando 2 shell, ma non vedo alcun modo per ottenere ciò che voglio. Qualcuno può mostrarmi come raggiungere il mio obiettivo?

Risposte:


11

Non puoi mangiare anche la tua torta. Le due cose che stanno accadendo qui sono l'esecuzione di uno script in una nuova shell e l'importazione di righe di script da eseguire nella shell corrente. Usando l'operatore punto (che è un alias per il sourcecomando) si esegue effettivamente il codice nella shell corrente . Se il tuo codice lo sceglie cd, una volta fatto sarai lasciato nella nuova directory.

Se invece si desidera eseguire un programma (o uno script, non importa), quel programma verrà avviato come processo secondario. Nel caso degli script di shell verrà aperta una nuova shell e il codice verrà eseguito al suo interno. Qualsiasi cdazione intrapresa cambierà la directory di lavoro corrente per quella shell, efficace per qualsiasi comando da seguire. Al termine del processo, la shell verrà chiusa, lasciandoti di nuovo nella shell originale (e non modificata).

Se è qualcosa che usi molto e vuoi che i suoi effetti vengano lasciati indietro nella tua shell corrente, forse potresti invece scrivere il tuo "script" come funzione shell e salvarlo nel tuo file ~ / .profile o altro shell rc.

function cpj() {
    # code here
    cd /path/$1
    emacs file_name
}

Caleb, grazie per il tuo contributo. Mi piace il tuo gioco di parole. Il tuo primo paragrafo ribadisce mirabilmente ciò che ho detto nella mia domanda. Il tuo secondo paragrafo ribadisce ciò che è stato detto nella domanda che ho citato abbastanza bene. Il tuo terzo paragrafo è esattamente quello che stavo cercando! Grazie amico.
bev

2

Ho una sceneggiatura simile scritta per uso personale. Esiste un trucco molto semplice per ottenere il cambiamento nella directory di lavoro all'interno di uno script. Per prima cosa basta scrivere la tua sceneggiatura, in.ex .:

#!/bin/bash

case $1 in
     project1) cd /home/me/work/customer1/project1
     ;;
     project2) cd /home/me/work/customer2/project1
     ;;
     project3) cd /home/me/work/customer3/project2
     ;;
     project4) cd /home/me/work/customer4/project5
     ;;
     *) echo "Usage: cdto cd_profile_name"
     ;;
esac

Ora supponiamo che lo script si chiami 'cdto'. Per farlo funzionare devi procurartelo nella shell corrente, cosa può essere ottenuto da 'source' o '.' comando (entrambi sono uguali). In es .:

. cdto project1

Ora per renderlo più conveniente:

  1. Copia lo script "cdto" in una directory "bin" del tuo account (ad es. / Home / johnsmith / bin - crealo se non esiste). Controlla la tua variabile PATH per assicurarti che la directory 'bin' sia inclusa:

    echo $ PATH

In caso contrario, modifica il tuo file .profile e aggiungi:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
  1. Aggiungi un alias al tuo file .bashrc o .bash_aliases:

    alias cdto = '. CDTO'

Ed è fatto. Dopo il prossimo accesso o quando apri un nuovo terminale potresti semplicemente usare in.ex .:

cdto project1

Godere :-)

Sebastian Piech


0

Un semplice trucco per fare questo:

pushd $PROJDIR && bash

Ora la directory di lavoro è $ PROJECT.

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.