Chci spustit skript, který jednoduše změní aktuální pracovní adresář:
#!/bin/bash cd web/www/project
Ale po jeho spuštění zůstane aktuální pwd beze změny! Jak to mohu udělat?
Odpovědět
Je to očekávané chování. Skript je spuštěn v subshellu a nemůže změnit pracovní adresář nadřazeného prostředí. Jeho efekty se po dokončení ztratí.
Chcete-li trvale změnit adresář aktuálního shellu, měli byste použít příkaz source
, alias také jednoduše jako .
, který spouští skript v aktuálním prostředí prostředí namísto dílčího prostředí.
Následující příkazy jsou identické:
. script
nebo
source script
Komentáře
Odpověď
U malých úkolů, jako je tento, místo vytváření skriptu vytvořte alias, jako je tento,
$ alias cdproj="cd /dir/web/www/proj"
Toto byste měli přidat do svého .bashrc
soubor, pokud ho chcete nastavit pro každý interaktivní shell.
Nyní jej můžete spustit jako $ cdproj
.
Komentáře
- Můžete také nechat skript ozvěnou příkazů, které mají být provedeny, a poté použít
eval `./script`
neboeval $(./script)
k provedení těchto příkazů. Toto je běžný přístup pro příkazy, které potřebují aktualizovat prostředí vyvolávajícího prostředí ‚ s. - Pokud se chystáte jít, buďte velmi opatrní ohledně toho, co vydáváte. přístup
eval
.
Odpověď
Použít exec bash
na konci
Baskript funguje na svém aktuálním prostředí nebo na prostředí svých dětí, ale nikdy na svém rodičovské prostředí.
Tato otázka se však často ptá, protože člověk chce zůstat v bash výzva v určitém adresáři po provedení bash skriptu z jiného adresáře.
Pokud je to tak, jednoduše na konci proveďte podřízenou instanci bash skriptu:
#!/usr/bin/env bash cd desired/directory exec bash
Tím se vytvoří nový subshell. Zadejte Ctrl + D nebo exit
a vraťte se do prvního prostředí, kde byl skript původně spuštěn.
Aktualizovat
Alespoň u novějších verzí bash
již exec
na posledním řádku již není vyžadován. Skript lze dále nastavit tak, aby pracoval s libovolným preferovaným shellem pomocí proměnné prostředí $SHELL
. To pak dává:
#!/usr/bin/env bash cd desired/directory $SHELL
Komentáře
- Lepší je pouze skript získat, jako v přijaté odpovědi : použití
exec
se obvykle považuje za poslední možnost darebáka .. 🙂 - tento trik ‚ t pracujte v debian 9 stretch.
- Tohle je špatný způsob, jak to udělat!
- Protože s tím nikdo podrobně nespecifikoval problémy (dívám se na vás, @Dennis): (1) Pokaždé, když toto spustíte, vytvoří se nový, trvalý proces bash. Udělejte to deset nebo dvacetkrát v relaci a budete mít nashromážděných 11 až 21 procesů bash. To může ovlivnit výkon, a pokud se pokusíte relaci ukončit čistě zadáním
exit
(nebo Ctrl + D), budete to muset provést 11 až 21krát. (2) Další nevýhodou použití spustitelného skriptu je, že pokud ve svém souboru nastavíte libovolné možnosti prostředí (např.dotglob
neboglobstar
) interaktivní relace shellu, ztratíte je, protože spouštíte nový shell. - Velmi pěkné řešení! ‚ jsem přepsal svůj alias v bash_profile, takže nyní se jedná o skript uložený v samostatném souboru. Pomocí skriptu přejdu do nově vytvořené dočasné složky. A teď je ještě snazší mít dočasnou relaci bash. SRP v akci! Dík!
Odpověď
I když existují odpovědi, které dělají přesně požadovanou akci, je to standardnější metoda účelem je vytvořit symbolický odkaz:
ln -s ~/web/www/project proj #use full path to dir!
Pak byste mohli cd
do adresáře použít název proj
:
cd proj
Tato metoda je flexibilnější, protože k souborům můžete přistupovat pomocí krátkého názvu bez cd
:
ls proj/ #note the endslash! vim proj/file.x
odpověď
záleží na tom, co „chystáme se udělat, dalším řešením může být vytvoření funkce místo skriptu.
Příklad:
Vytvořte funkci v souboru, řekněme /home/aidin/my-cd-script
:
function my-cd() { cd /to/my/path }
Poté jej zahrňte do bashrc
nebo zshrc
soubor:
# Somewhere in rc file source /home/aidin/my-cd-script
Nyní jej můžete použít jako příkaz:
$ my-cd
Odpověď
Pokud v souborovém systému přepínáte mezi vzdálenými adresáři. Doporučím autojump .
Odpověď
Nejpohodlnějším a nejflexibilnějším přístupem pro mě byla kombinace aliasu a skriptu:
vytvořit skript s libovolnou logikou
Zde vytvořím skript, který se změní na adresář a aktivuje příslušné prostředí pythonu. Umístění skriptů je příkladné v /path/to/workon_myproj.sh
.
#!/usr/bin/env bash cd $HOME/workspace/myproj source .venv/bin/activate
vytvoření aliasů, které zdrojují skript
alias workon_myproj="source /path/to/workon_myproj.sh"
Přidejte definici aliasu do příslušného startovacího souboru prostředí, např. .profile
, .bashrc
nebo .zshrc
.
výsledek
Nyní můžete jednoduše spustit soubor workon_myproj
v prostředí, které bude zdrojem obsahu vašeho skriptu v požadovaném adresáři.
rozšiřitelnost
Dalo by se vylepšit váš skript, aby převzal argument, aby fungoval s více projekty v konkrétním pracovním adresáři, nebo jej kombinovat s git pull
, abyste okamžitě získali nejnovější změny a tak na … všechno, co děláte, když pracujete na konkrétním projektu.
Odpovědět
Proč nepoužívat “ exec „dělá to, co chci.
#!/bin/bash cd someplace exec bash ~/someplace
Komentáře
- Dejte si pozor na věci, které Zdá se , že je to, co chcete. (Obří dřevěný kůň! Přesně to jsem chtěl!) Pokaždé, když to spustíte, vytvoří se nový, trvalý bash proces. Udělejte to deset nebo dvacetkrát v relaci a budete mít naskládaných 11 až 21 procesů bash. To může ovlivnit výkon a pokud se pokusíte relaci ukončit čistě zadáním
exit
(nebo Ctrl + D), budete to muset provést 11 až 21krát. - Rozhodně jsem viděl, kde by to byl problém. Pro mě to ale ‚ používám jednou, dělám práci, kterou potřebuji, a poté ukončím. Pokud je to ‚ jedinou nevýhodou, s tím může žít. Na druhou stranu, pokud existuje lepší řešení, jsem ‚ ochoten se na něj podívat.
- Odpověď Aidina na tuto otázku pomocí funkce shellu a odpověď Sachina Divekara pomocí aliasu jsou (IMO) lepším řešením než použití skriptu . P.S. Další nevýhodou použití skriptu je, že pokud nastavíte jakékoli možnosti prostředí (např.
dotglob
neboglobstar
), ztratíte je, protože začínáte nový shell. … (Pokračování) - (pokračování)… P.P.S. Právě jsem si všiml, že v zásadě opakujete odpověď Serge Stroobandta a říkáte Proč to neudělat? Na Stack Exchange očekáváme, že odpovědi poskytnou nové nápady nebo informace, nejen diskutovat o dalších odpovědích.
Odpovědět
To kombinuje odpověď Serge s nesouvisející odpovědí Davida . Změní adresář a poté místo vynucení prostředí bash spustí výchozí prostředí uživatele . Vyžaduje však getent
a /etc/passwd
detekovat výchozí prostředí.
#!/usr/bin/env bash cd desired/directory USER_SHELL=$(getent passwd <USER> | cut -d : -f 7) $USER_SHELL
Samozřejmě to má stále stejný nedostatek při vytváření vnořeného shellu.
Odpověď
Můžete to udělat pomocí funkce nebo pomocí & & Níže uvedené příklady nainstalují Zabbix a vytvoří soubor s řádkem uvnitř.
Příklad:
#!/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
nebo:
#!/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
uniknout z takto získaného skriptu, nikoliexit
– jsou jako funkce prostředí aexit
opustí prostředí, ze kterého byl získán skript.source ./script
stejný?.
asource
jsou si rovny v bash. 2. don ‚ Pokud je soubor ‚ ve stejném adresáři, je třeba před název souboru použít./
. Je v pořádku spustit pouze toto:. script