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
kilép a parancsfájlból származó héjból.
source ./script
ugyanaz? .
é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`
vagyeval $(./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
vagyglobstar
) 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
vagyglobstar
), 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
return
az így beszerzett szkriptből való meneküléshez, nem pedigexit
– olyanok, mint a shell függvények, és >