Chci spustit skript, který jednoduše změní aktuální pracovní adresář:
#!/bin/bash
cd web/www/project
Ale po spuštění to, aktuální pwd zůstává nezměněn! Jak to mohu udělat?
Je to očekávané chování a bylo již několikrát diskutováno.
Skript je spuštěn v podsíti a nemůže změnit nadřazený pracovní adresář Shell. Po dokončení se jeho efekty ztratí.
Chcete-li změnit adresář natrvalo, měli byste source skript, jako v
. ./script
Pro malé úkoly, jako je tento, místo vytváření skriptu vytvořte alias jako je tento,
$ alias cdproj='cd /dir/web/www/proj'
Měli byste to přidat do svého .bashrc
soubor, pokud chcete nastavit pro každý interaktivní Shell.
Nyní to můžete spustit jako $ cdproj
.
exec bash
na konciBash skript pracuje v jeho současném prostředí nebo v prostředí svých dětí, ale nikdy v mateřském prostředí.
Tato otázka se však často zeptá, protože chce zůstat po bash Prompt v určitém adresáři po spuštění bash skriptu z jiného adresáře.
Pokud je tomu tak, jednoduše spusťte na konci skriptu podřízenou instanci bash:
#!/usr/bin/env bash
cd desired/directory
exec bash
Tím se vytvoří nové podsítí. Zadejte exit
pro návrat k prvnímu prostředí, kde byl původně spuštěn skript.
I když existují odpovědi, které provádějí přesnou akci, kterou chcete, standardní metodou pro tento účel je vytvoření symbolického odkazu:
ln -s ~/web/www/project proj #use full path to dir!
Pak můžete cd
do adresáře s názvem proj
:
cd proj
Tato metoda je flexibilnější, protože můžete přistupovat k souborům pomocí krátkého jména bez cd
:
ls proj/ #note the endslash!
vim proj/file.x
Závisí na tom, co budete dě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
}
Pak jej vložte do svého souboru bashrc
nebo zshrc
:
# Somewhere in rc file
source /home/aidin/my-cd-script
Nyní ji můžete použít jako příkaz:
$ my-cd
Pokud změníte mezi adresáři daleko v souborovém systému. Doporučím autojump .
Stačí napsat do PWD
a exportovat jej do skriptu a změna bude přetrvávat.
export PWD=/your/desired/directory
Nejpohodlnějším a nejflexibilnějším přístupem pro mě byla směsice aliasu a skriptu:
Zde vytvořím skript, který se změní v adresáři a aktivuje vhodné prostředí python=. 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
alias workon_myproj='source /path/to/workon_myproj.sh'
Přidejte definici aliasu do příslušného startovacího souboru Shell, např. .profile
, .bashrc
nebo .zshrc
.
Nyní můžete jednoduše provést workon_myproj
v prostředí, které bude zdroj obsahu skriptu v požadovaném adresáři.
Událost můžete vylepšit tak, aby argumentovala, aby fungovala s více projekty v konkrétním pracovním adresáři, nebo je zkombinujte s git pull
získat nejnovější změny okamžitě a tak dále ... všechno, co dělá deska kotle, když děláte práci na konkrétním projektu.
Proč nepoužívat "exec" to švy dělat přesně to, co si přeji.
#!/bin/bash
cd someplace
exec bash
~/someplace