Jak mogę eksportować / source /. od partnera -e?

4

Próbuję napisać prosty skrypt, który uruchamia terminal i uruchamia polecenie workon foo. Innymi słowy, chcę po prostu zrobić:

mate-terminal -e workon foo

Jednak to nie działa, ponieważ workonpolecenie wymaga ode mnie:

export WORKON_HOME=~/work;
source /usr/local/bin/virtualenvwrapper.sh

Normalnie te linie są uruchamiane automatycznie, ponieważ są w moim .bashrc, ale najwyraźniej mate-terminal -enie robi source ~/.bashrc. Jeśli jednak spróbuję dodać te wiersze do mojego skryptu:

mate-terminal -e export WORKON_HOME=~/work; source /usr/local/bin/virtualenvwrapper.sh; workon foo

to też nie działa. MATE mówi mi:

There was an error creating the child process for this terminal
Failed to execute child process "export" (No such file or directory)

Mam ten sam problem, jeśli pomiń exporti po prostu zrób mate-terminal -e source ...lub jeśli spróbuję użyć .zamiast source( mate-terminal -e . ...).

Nie jestem pewien, w jaki sposób można załadować wszystko, jeśli nie mogę, export, source, lub ., ale musi być jakiś sposób, ponieważ mate-terminal -ebyłoby niemal bezużyteczna bez niego.

Czy ktoś wie, jak mogę skonfigurować swoje środowisko w terminalu, od którego zacząłem mate-terminal -e?

machineghost
źródło

Odpowiedzi:

2

Nie mam zainstalowanej wersji mate-terminal, ale jeśli działa podobnie gnome-terminal, możesz wypróbować jeden z następujących sposobów:

  • pisać bezpośrednio coś takiego jak lub
    mate-terminal -e bash -c 'WORKON_HOME=$HOME/work; source /usr/local/bin/virtualenvwrapper.sh; workon foo'

    mate-terminal -e "bash -c 'WORKON_HOME=$HOME/work; source /usr/local/bin/virtualenvwrapper.sh; workon foo; read line'"

    (szczerze mówiąc gnome-terminal, powinieneś użyć -xzamiast -e).

  • Aby utworzyć skrypt wykonywalny (o nazwie WorkOnScript.sh, z chmod u+x WorkOnScript.sh)

    #!/bin/bash 
    WORKON_HOME=$HOME/work;
    source /usr/local/bin/virtualenvwrapper.sh
    cd $HOME/work                                          # If needed
    workon foo
    sleep 10s         # to add  a pause before script and terminal end
    read line         # to wait you press return to close the terminal
    

    i spróbować go wykonać

     mate-terminal -e /path/to/WorkOnScript.sh
    

    lub

     mate-terminal -e "/bin/bash -c \"/path/to/WorkOnScript.sh\""
    

Uwaga

Możliwe jest pozostawienie terminala otwartego, dodając jako ostatnie polecenie w ciągu przekazanym do bash -c lub jako ostatni wiersz skryptu:

  • przez kilka sekund (lub godzin ...) dodawanie sleep 10s(lub spanie 10h).
  • aż zostanie naciśnięty przycisk returndodawaniaread line
  • aż do naciśnięcia lub dodania (wykonuje powłokę).ctrl+dexit/bin/bash

W przypadku niektórych terminali poprzez specyfikację parametrów można pozostawić je otwarte po wykonaniu poleceń. Z mate-terminalem możesz spróbować zobaczyć, co jest interesujące mate-terminal --help-all. Po utworzeniu profilu z zaznaczoną opcją „Przytrzymaj terminal” możesz wywołać terminal z opcją --window-with-profile=PROFILENAMElub--tab-with-profile=PROFILENAME

Referencje

Hastur
źródło
Kiedy próbuję pierwszej wersji, którą podałeś, dostałem Failed to parse arguments: Unknown option -c. Potem wypróbowałem drugą wersję, która działała świetnie ... przez około 1ms; potem terminal został zamknięty (prawdopodobnie dlatego, że polecenie zostało zakończone). Więc wtedy wypróbowałem formularz skryptu i próbowałem wykonać go w obie strony, tak jak sugerowałeś, ale miał ten sam problem (tj. Terminal został natychmiast zamknięty). Jeśli masz jakieś sugestie, jak mogę rozwiązać problem z zamykaniem terminala, chętnie zaakceptuję tę odpowiedź.
machineghost
@machineghost: Aby uniknąć efektu 1ms , możesz wstawić jako ostatni wiersz skryptu a read line(lub a sleep 10s), aby skrypt czekał po naciśnięciu klawisza Return to end (lub 10 sekund). Możesz użyć tej samej sztuczki po swoim poleceniu w ciągu polecenia bash...; workon foo; read line ... . Zasadniczo dla wielu terminali jest możliwe, patrz tutaj na przykład (+) , aby podać parametr, aby utrzymać terminal otwarty. W mate-terminal możesz użyć profilu jeden `--window-with-profile` po tym, jak utworzyłeś taki, jak sugerowano powyżej (+).
Hastur
Szybka uwaga: dostałem również błąd „Brak modułu o nazwie virtualenvwrapper virtualenvwrapper.sh”, ale naprawiłem go, znajdując odpowiedź tutaj: stackoverflow.com/questions/29486113/…
machineghost
2

Co powiesz na uruchomienie go w skrypcie?

więc stwórz swój skrypt:

touch ~/myscript.sh
chmod 700 ~/myscript.sh
vi ~/myscript.sh

następnie edytuj to, co chcesz. W vi użyj i, aby wstawiać i uważaj na używanie backspace, użyj ESC, a następnie X, aby usunąć. Następnie wykonaj ESC, a następnie ! Qw, aby zapisać i wyjść:

#!/bin/bash
export WORKON_HOME=~/work;
source /usr/local/bin/virtualenvwrapper.sh
mate-terminal -e workon foo

następnie spróbuj go uruchomić:

./myscript.sh
PHoBwz
źródło
Dzięki za sugestię, ale niestety to podejście nie działa. Kiedy uruchamiam myscript, wydaje mi się No module named virtualenvwrapper virtualenvwrapper.sh: There was a problem running the initialization hooks. , że sourcepolecenie w skrypcie nie przenosi się do nowej mate-terminalsesji :(
machineghost