Szkript az aktuális könyvtár megváltoztatásához (cd, pwd)

Futtatni szeretnék egy szkriptet az aktuális munkakönyvtár egyszerű megváltoztatásához:

#!/bin/bash cd web/www/project 

De miután futtattam, a jelenlegi pwd változatlan marad! Hogyan tudom ezt megtenni?

Válasz

Ez várható viselkedés. A szkript alhéjban fut, és nem tudja megváltoztatni a szülő shell munkakönyvtárát. Hatásai elvesznek, amikor befejeződik.

Az aktuális shell könyvtárának végleges megváltoztatásához használja a source parancsot, más néven egyszerűen csak ., amely egy parancsfájlt futtat az aktuális shell környezetben egy alhéj helyett.

A következő parancsok megegyeznek:

. script 

vagy

source script 

megjegyzések

  • @Sony: Ne feledje, hogy return az így beszerzett szkriptből való meneküléshez, nem pedig exit – olyanok, mint a shell függvények, és >

kilép a parancsfájlból származó héjból.

  • @CharlesStewart Valójában ‘ nem ismerem a beszerzett szkripteket. Köszönöm!
  • source ./script ugyanaz?
  • @amyassin: igen, ez
  • 1. . és source egyenlő a bash-ban. 2. nem ‘ t a ./ fájlt kell használni a fájlnév előtt, ha ‘ s ugyanabban a könyvtárban van. Csak ezt szabad futtatni: . script
  • Válasz

    Az ehhez hasonló kis feladatokhoz szkript létrehozása helyett hozzon létre egy ilyen álnevet,

    $ alias cdproj="cd /dir/web/www/proj" 

    Ezt hozzá kell adnia a .bashrc fájl, ha azt szeretné, hogy minden interaktív héjhoz beállítva legyen.

    Most ezt futtathatja $ cdproj néven.

    Megjegyzések

    • A parancsfájl is visszhangozhatja a végrehajtandó parancsokat, majd használhatja a eval `./script` vagy eval $(./script) a parancsok végrehajtásához. Ez egy általános megközelítés azoknál a parancsoknál, amelyeknek frissíteniük kell a meghívó héj ‘ s környezetet.
    • Csak nagyon vigyázzon arra, hogy mit ad ki, ha megy a eval megközelítés.

    Válasz

    A exec bash a végén

    A bash szkript a jelenlegi vagy gyermekei környezetében működik, de soha nem a saját környezetében szülői környezet.

    Ezt a kérdést azonban gyakran felteszik, mert a bash-ban akarják hagyni parancs egy bizonyos könyvtárban egy másik könyvtárból származó bash parancsfájl végrehajtása után.

    Ebben az esetben egyszerűen hajtsa végre a gyermek bash példányát a végén parancsfájl:

    #!/usr/bin/env bash cd desired/directory exec bash 

    Ez új alhéjat hoz létre. Írja be a Ctrl + D vagy a exit parancsot, hogy visszatérjen az első héjhoz, ahol a szkript eredetileg elindult.

    Frissítés

    Legalább a bash újabb verzióival az utolsó sor exec -jére már nincs szükség. Ezenkívül a szkript a $SHELL környezeti változó használatával bármely előnyben részesített héjjal működtethető. Ez aztán a következőket adja:

    #!/usr/bin/env bash cd desired/directory $SHELL 

    Megjegyzések

    • Jobb a szkript forrása, mint az elfogadott válaszban : a exec használatát általában egy gazember utolsó lehetőségének tekintik .. 🙂
    • ez a trükk nem ‘ t dolgozzon a debian 9 szakaszban.
    • Ez a helytelen módszer erre!
    • Mivel senki nem részletezte a problémákat ezzel (nézlek, @Dennis): (1) A futtatás minden egyes alkalmával új, tartós bash folyamatot hoz létre. Tegye meg tíz-húszszor egy munkamenet során, és 11–21 bash folyamatot halmoz fel. Ez befolyásolhatja a teljesítményt, és ha megpróbálja a munkamenetet tisztán befejezni a exit (vagy a Ctrl + D) beírásával, akkor ezt 11-21 alkalommal kell megtennie. (2) A futtatható szkript használatának másik hátránya, hogy ha bármilyen shell opciót állít be (pl. dotglob vagy globstar) interaktív shell munkamenet, elveszíti őket, mert új héjat indít.
    • Nagyon jó megoldás! ‘ átírtam az álnevemet a bash_profile fájlba, így ez most egy külön fájlban tárolt szkript. A szkript segítségével egy újonnan létrehozott ideiglenes mappába megyek. És most még könnyebb egy ideiglenes bash munkamenetet tartani. SRP működésben! Köszönöm!

    Válasz

    Bár vannak olyan válaszok, amelyek pontosan a kívánt műveletet hajtják végre, egy szabványosabb módszer az ilyenekre célja szimbolikus link létrehozása:

    ln -s ~/web/www/project proj #use full path to dir! 

    Ezután cd átkerülhet a könyvtárba a proj:

    cd proj 

    Ez a módszer rugalmasabb, mert a fájlokat a rövid név használatával érheti el :

    ls proj/ #note the endslash! vim proj/file.x 

    Válasz

    Attól függ, hogy mit “Meg fogjuk csinálni, egy másik megoldás lehet függvény létrehozása szkript helyett.

    Példa:

    Hozzon létre egy függvényt egy fájlban, mondjuk” s “/home/aidin/my-cd-script:

    function my-cd() { cd /to/my/path } 

    Ezután vegye fel a bashrc vagy zshrc fájl:

    # Somewhere in rc file source /home/aidin/my-cd-script 

    Most parancsként használhatja:

    $ my-cd 

    Válasz

    Ha a fájlrendszerben messze lévő könyvtárak között vált. Javasolni fogom a autojump alkalmazást.

    Válasz

    Számomra a legkényelmesebb és legrugalmasabb megközelítés az álnév és a szkript keveréke volt:

    parancsfájl létrehozása tetszőleges logikával

    Itt létrehozok egy parancsfájlt, amely könyvtárra vált és aktiválja a megfelelő python környezetet. A szkriptek helye exmplary a /path/to/workon_myproj.sh fájlban.

    #!/usr/bin/env bash cd $HOME/workspace/myproj source .venv/bin/activate 

    álnevet hoz létre, amely a szkriptet forrja

    alias workon_myproj="source /path/to/workon_myproj.sh" 

    Az alias definíciót adja hozzá a megfelelő shell start fájlhoz, pl. .profile, .bashrc vagy .zshrc.

    kimenetel

    Most egyszerűen végrehajthatja a workon_myproj parancsfájlt egy shellben, amely a parancsfájl tartalmát a kívánt könyvtárba hozza.

    bővíthetőség

    Eseményt javíthat a szkripten, hogy argumentumot kapjon úgy, hogy az egy adott munkakönyvtárban lévő több projekttel működjön, vagy kombinálhatja egy git pull hez, hogy azonnal megkapja a legújabb változtatásokat, így … minden, amit a kazánlemezről tesz, amikor folytatja a munkát egy adott projekten.

    Válasz

    Miért ne használná ” exec “pontosan azt varázsolja, amit kívánok.

    #!/bin/bash cd someplace exec bash ~/someplace 

    Megjegyzések

    • Óvakodj olyan dolgoktól, amelyek úgy tűnik , amire vágysz. (Óriási fa ló! Pontosan azt, amit szerettem volna!) Valahányszor ezt futtatja, új, kitartó bash folyamatot hoz létre. Tegye meg tíz vagy húsz alkalommal egy munkamenet során, és 11–21 bash folyamatot halmoz fel. Ez befolyásolhatja a teljesítményt, és ha megpróbálja a munkamenetet tisztán befejezni a exit (vagy a Ctrl + D) beírásával, akkor ezt 11-21 alkalommal kell megtennie.
    • Határozottan láttam, hogy ez hol jelentene problémát. Számomra azonban ‘ egyszer használom, elvégzem a szükséges munkát, majd kilépek. Ha ez az ‘ az egyetlen hátrányom, élhet ezzel. Viszont ha van jobb megoldás, akkor ‘ hajlandó vagyok megnézni.
    • Aidin válasza erre a kérdésre , egy shell függvény használatával, és Sachin Divekar válasza álnév segítségével jobb megoldások (IMO), mint egy szkript használata . P.S. A szkript használatának másik hátránya, hogy ha bármilyen shell opciót állít be (pl. dotglob vagy globstar), akkor azokat elveszíti, mert új héjat indítasz. … (Folytatás)
    • (folytatás)… P.P.S. Most vettem észre, hogy alapvetően megismétli Serge Stroobandt válaszát , és azt mondja: “Miért ne tenné ezt?” At Stack Exchange arra számítunk, hogy a válaszok új ötleteket és / vagy információkat nyújtanak, és nem csak más válaszokat tárgyalnak meg.

    Válasz

    Ez ötvözi a Serge válaszát egy David nem válaszolt . Megváltoztatja a könyvtárat, majd egy bash shell kikényszerítése helyett elindítja a felhasználó alapértelmezett shelljét . getent és /etc/passwd egyaránt az alapértelmezett héj észleléséhez.

     #!/usr/bin/env bash cd desired/directory USER_SHELL=$(getent passwd <USER> | cut -d : -f 7) $USER_SHELL  

    Természetesen ennek még mindig ugyanaz a hiánya a beágyazott héj létrehozásában.

    Válasz

    Ezt megteheti egy függvény használatával, vagy a & & használatával. A példák szerint a Zabbix telepíti és létrehoz egy fájl, benne egy sor.

    Példa:

    #!/bin/bash # Create Function: installZabbix(){ cd /usr/src/zabbix-4.2.4; ./configure --enable-agent; make install; cd /usr/src/; >file; echo "Hi, this is a file." >>file; } # Call the function: installZabbix 

    vagy:

    #!/bin/bash cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file 

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük