it-swarm-eu.dev

Skript pro změnu aktuálního adresáře (cd, pwd)

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?

56
Sony Santos

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
76
enzotib

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.

27
Sachin Divekar

Použijte exec bash na konci

Bash 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.

14
Serge Stroobandt

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
8
corvinus

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
5
Aidin

Pokud změníte mezi adresáři daleko v souborovém systému. Doporučím autojump .

4
stnly

Stačí napsat do PWD a exportovat jej do skriptu a změna bude přetrvávat.

export PWD=/your/desired/directory
1
Samha'

Nejpohodlnějším a nejflexibilnějším přístupem pro mě byla směsice aliasu a skriptu:

vytvořit skript s libovolnou logikou

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

vytvořit alias, který zdroje skript

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.

výsledek

Nyní můžete jednoduše provést workon_myproj v prostředí, které bude zdroj obsahu skriptu v požadovaném adresáři.

rozšiřitelnost

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.

0
Jan

Proč nepoužívat "exec" to švy dělat přesně to, co si přeji.

#!/bin/bash

cd someplace
exec bash

~/someplace
0
paul