Uruchom skrypt w bieżącej powłoce bez. przed rozkazem


26

Jeśli skrypt powinien zostać wykonany w bieżącej powłoce, można to osiągnąć, dodając kropkę przed poleceniem:

   . ./somescript.sh

Czy można to zrobić bez wpisywania kropki za każdym razem? Na przykład polecenie zmiany powłoki macierzystej z samego skryptu?

Odpowiedzi:


22

To może nie być dokładnie to, co chcesz, ale możesz zrobić:

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

2
To doskonale rozwiązało mój problem. Dziękuję Ci!
alu

8

Czy można to zrobić bez wpisywania kropki za każdym razem? Na przykład polecenie zmiany powłoki macierzystej z samego skryptu?

Nie sądzę, że tak jest (poza pisaniem na klawiaturze source somescript.sh, ale prawdopodobnie nie tego szukasz ^^).

Jeśli uruchomisz skrypt w zwykły sposób ./somescript.sh, powłoka rozwidli się i wykona to polecenie. Przekazuje polecenie do jądra, a następnie jądro decyduje o sposobie wykonania tego polecenia, analizując #!wiersz w skrypcie. Jądro następnie uruchamia określony interpreter (w tym przypadku prawdopodobnie bashpodpowłoka). Dlatego modyfikacje somescript.shjego środowiska są izolowane w podpowłoce bez wpływu na powłokę nadrzędną.

Jeśli chcesz, aby powłoka odczytywała sam skrypt bez uruchamiania innego procesu, musisz to wyraźnie powiedzieć za pomocą słowa kluczowego .lub source.


Dziękuję za szczegółowe wyjaśnienie. :) Teraz widzę, że nie ma możliwości zrobienia tego z wywoływanego skryptu, ale na szczęście można powiedzieć powłoce nadrzędnej, aby nie tworzyła podpowłoki za pomocą aliaspolecenia, jak sugerował Scott.
alu

1

Jeśli uruchamiasz się ./somescript.shjako program zewnętrzny, nie może nic zrobić wewnątrz uruchomionego procesu powłoki, na przykład uzyskać dostęp do nieeksportowanych zmiennych, ustawić zmienne, zmienić bieżący katalog itp. Nie można tego obejść.

(Cóż, ok, możesz uruchomić debugger z podprocesu i poprawić pamięć procesu nadrzędnego. Ale jeśli spróbujesz, najprawdopodobniej nastąpi awaria powłoki nadrzędnej.)

Musisz biec . ./somescript.sh. Możesz ukryć to za aliasem lub funkcją, jeśli chcesz, ale ponownie definicja aliasu lub funkcji musi zostać wykonana w powłoce nadrzędnej.


0

Myślę, że skrypt, który próbujesz uruchomić, nie jest wykonywalny. chmod a+x somescript.shdoda bit wykonania dla użytkownika, grupy i innych (ugo) do tego pliku. Pierwszy wiersz pliku będzie również potrzebował #! linia na górze, jak #!/bin/bash.

ls -l somescript.shpokaże trojaczki rwx (odczyt / zapis / wykonanie) dla pliku. Będzie potrzebował x przynajmniej w pierwszym zestawie, zakładając, że jesteś właścicielem pliku.


Same skrypty działają dobrze, ale chcę je wykonać w bieżącej powłoce, aby móc modyfikować zmienne środowiskowe powłoki.
alu

Jeśli eksportowanie zmiennej, którą chcesz w skrypcie, nie działa, na przykład export PATH=$PATH:/usr/local/bindodanie / usr / local / bin do $ PATH, to musisz zmienić plik źródłowy, aby zmienić działające zmienne środowiskowe. To pytanie brzmi naprawdę: „Jak programowo zmienić moje zmienne środowiskowe w działającej powłoce ze skryptu bash?” Skrypt . ./somescript.shdziała poprawnie - używasz polecenia kropki do źródła w pliku. tcsh używa „źródła” do tego samego.
AR Diederich

Modyfikacja zmiennej była tylko przykładem. Moje pytanie brzmi: czy można powiedzieć powłoce, że powinna istnieć kropka bez pisania (na przykład z samego skryptu)
alu

Kropkę można łatwo zapomnieć, co może całkowicie zmienić zachowanie skryptu.
alu

0
export PATH=$PATH:.

Uruchomienie tego polecenia w powłoce lub dodanie go do pliku konfiguracyjnego powłoki spowoduje dołączenie bieżącego katalogu do zmiennej PATH. Zmienna PATH to lista katalogów, w których powłoka będzie szukała plików binarnych do wykonania po wydaniu polecenia.

Umożliwi to uruchomienie dowolnego pliku wykonywalnego w bieżącym katalogu bez ./


1
OP pyta o pierwszy, a .nie ten, ./który jest częścią nazwy pliku. Uruchomienie ./somescript nie wykonuje go w bieżącej powłoce, jak to . ./somescriptrobi.
Anthon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.