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?
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 prawdopodobniebash
podpowłoka). Dlatego modyfikacjesomescript.sh
jego ś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
.
lubsource
.źródło
alias
polecenia, jak sugerował Scott.Jeśli uruchamiasz się
./somescript.sh
jako 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.źródło
Myślę, że skrypt, który próbujesz uruchomić, nie jest wykonywalny.
chmod a+x somescript.sh
doda 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.sh
pokaż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.źródło
export PATH=$PATH:/usr/local/bin
dodanie / 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.sh
działa poprawnie - używasz polecenia kropki do źródła w pliku. tcsh używa „źródła” do tego samego.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
./
źródło
.
nie ten,./
który jest częścią nazwy pliku. Uruchomienie ./somescript nie wykonuje go w bieżącej powłoce, jak to. ./somescript
robi.